我有两个数组,其中一个数组具有零值,而另一个数组只有数字而没有零值。像这样
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在循环中未定义。
有人可以帮我吗?非常感谢!
答案 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))
);