如何使用Javascript中的另一个数组的值更改数组中的特定非零值

时间:2019-06-04 16:30:08

标签: javascript arrays multidimensional-array

我有两个数组,其中一个数组具有零值,而另一个数组只有数字而没有零值。像这样

array1 = [0,0,0,4,5,0,0,0,0,0,0,0]

array2 = [456, 299]

现在,我想将array1的非零数字与array2交换。

它最终像这样:

array1 = [0,0,0,456,299,0,0,0,0,0,0,0]

我已经尝试过了:

let array1 = [0, 0, 0, 4, 5, 0, 0, 0, 0, 0, 0, 0]

let array2 = [456, 299]

let j = 0

for (i = 0; i <= array1.length; i++) {
  if (array1[i] != 0) {
    array1[i] = array2[j]
    j++
  } else {
    array1[i] = 0
  }
}


console.log(array1)

那是行不通的,因为j在循环中未定义。

有人可以帮我吗?非常感谢!

4 个答案:

答案 0 :(得分:3)

您可以映射这些值,并从另一个数组中获取一个真实值作为移位值。

var array1 = [0, 0, 0, 4, 5, 0, 0, 0, 0, 0, 0, 0],
    array2 = [456, 299],
    result = array1.map(v => v && array2.shift());

console.log(...result);

一种非变异版本,其索引封闭。

var array1 = [0, 0, 0, 4, 5, 0, 0, 0, 0, 0, 0, 0],
    array2 = [456, 299],
    result = array1.map((i => v => v && array2[i++])(0));

console.log(...result);

答案 1 :(得分:2)

您可以从array2处获取迭代器,并在其上调用next以在您map遍历另一个数组时依次获取每个值:

let array1 = [0, 0, 0, 4, 5, 0, 0, 0, 0, 0, 0, 0]
let array2 = [456, 299]

let it = array2[Symbol.iterator]()
let res = array1.map(n => n && it.next().value)

console.log(res)

如果array2中的值用完了,则会将undefined s添加到数组中-尚不清楚这是否可行或正确的行为。

答案 2 :(得分:1)

由于您使用的是i <= array.length,因此您的其他部分会继续在array1的最后添加一个值,然后遇到infinite loop,或者您可以简单地使用i < array1.length

只需删除您不需要的else部分

let array1 = [0, 0, 0, 4, 5, 0, 0, 0, 0, 0, 0, 0]

let array2 = [456, 299]

let j = 0

for (i = 0; i <= array1.length - 1; i++) {
  if (array1[i] != 0) {
    array1[i] = array2[j]
    j++
  }
}


console.log(array1)

答案 3 :(得分:1)

您可以将地图与经过管理的IIFE一起使用,因此您无需创建仅在地图函数之外的地图函数中使用的变量。

如果array1的项不为零,则其长度不大于array2的长度。

const array1 = [0, 0, 0, 4, 5, 0, 0, 0, 0, 0, 0, 0];
const array2 = [456, 299];

console.log(
  array1.map(
    (index => item =>
      item !== 0 ? array2[index++] : item)(0)
  )
);

非IIFE版本:

const array1 = [0, 0, 0, 4, 5, 0, 0, 0, 0, 0, 0, 0];
const array2 = [456, 299];
//create an index variable to be used in the map function
let index = 0;
console.log(
  array1.map(item => (item !== 0 ? array2[index++] : item))
);