替换特定索引处的值(数组)

时间:2018-08-19 19:25:34

标签: javascript arrays

大家晚上好

我有一个包含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“

有人可以引导我吗?

谢谢!

4 个答案:

答案 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";   
}

演示: https://jsfiddle.net/s59jt870/3/

答案 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(' '));