大家晚上好
我有一个包含24个字符的数组
"hours": [
"1",
"1",
"1",
"1",
"0",
"0",
"0",
"0",
"0",
"0",
"0",
"0",
"0",
"0",
"0",
"0",
"0",
"0",
"0",
"0",
"0",
"0",
"0",
"0"
]
我想搜索另一组索引;例如[2,5,9,10]
然后,转到第一个数组的位置(第一个数组的位置)(2、5、9和10),并将字符更改为该位置“ 1”,然后将其余的数组移至“ 0“
有人可以引导我吗?
谢谢!
答案 0 :(得分:2)
解决方案:
var hours = ["1", "1", "1", "1", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0"],
positions = [2, 5, 9, 10];
for (var i = 0; i < hours.length; i++) {
hours[i] = positions.includes(i) ? "1" : "0";
}
console.log(hours);
// ["0", "0", "1", "0", "0", "1", "0", "0", "0", "1", "1", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0"]
演示: https://jsfiddle.net/gzynud0c/1/
正如评论中指出的那样,以上解决方案在所有主要领域均适用 浏览器(包括IE9 +),而无需使用诸如Babel或 使用polyfill。
以下内容适用于所有浏览器。
for (var i = 0; i < hours.length; i++) {
hours[i] = ~positions.indexOf(i) ? "1" : "0";
}
答案 1 :(得分:2)
我觉得这里最简单的方法是先将hours
数组的所有值(根据需要更改或不更改)设置为"0"
,然后仅访问我们必须设置的位置"1"
并将其设置在那里!
indices.reduce((h,v)=>(h[v]="1") && h, hours.map(()=>"0"))
let hours = ["1", "1", "1", "1", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0"],
indices = [2, 5, 9, 10];
let res = indices.reduce((h,v)=>(h[v]="1") && h, hours.map(()=>"0"));
console.log(res);
.as-console-wrapper { max-height: 100% !important; top: 0; }
答案 2 :(得分:1)
听起来好像您想查看第一项和forEach
项中的所有项,如果它是索引数组中的索引,则将值更改为1
,否则将0
, 对?。您可以几乎将句子翻译成代码:
let hours= [ "1", "1", "1", "1", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0" ]
let indexes = [2, 5, 9, 10]
hours.forEach((item, index, self) => self[index] = indexes.includes(index) ? '1' : '0' )
console.log(hours)
这会改变原始数组。如果您想要一个新数组,可以使用map()
做类似的事情:
let hours= [ "1", "1", "1", "1", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0" ]
let indexes = [2, 5, 9, 10]
// leave hours as is and create a new array
let newArray = hours.map((item, index, self) => indexes.includes(index) ? '1' : '0' )
console.log(newArray)
如果您的数组非常大,这将是无效的,因为您每次迭代都会遍历indexes
数组。如果是这种情况,您可以将indexes
数组转换为类似于set的内容,以进行恒定时间查找。另外,您可以从零数组开始并设置一个:
let hours= [ "1", "1", "1", "1", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0" ]
let indexes = [2, 5, 9, 10]
let newHours = indexes.reduce((a, index) => (a[index] = '1', a), Array.from(hours).fill("0"))
console.log(newHours)
答案 3 :(得分:1)
使用排序的索引数组,您可以为其获取索引j
并使用该值检查循环索引i
并更改索引数组索引并返回'1'
或{ {1}}。
'0'
var hours = ["1", "1", "1", "1", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0"],
indices = [2, 5, 9, 10],
replaced = hours.map((j => (v, i) => indices[j] === i && ++j ? '1' : '0')(0));
console.log(replaced.join(' '));