我有一个数组:
var myArray = [2, 4, 6];
和另一个数组:
var otherArray = [1, , 3, , 5, , 7];
我正在尝试映射(或使用任何非“for / for-each”迭代器)将每个myArray
值放入otherArray
的相应空白区域。
希望输出:
newArray = [1, 2, 3, 4, 5, 6, 7];
有什么想法吗?
答案 0 :(得分:4)
otherArray.forEach(function (val, idx) {
if (typeof val === 'undefined') {
otherArray[idx] = myArray.shift();
}
});
如果支持IE< forEach
可能不兼容。 9虽然。
使用Array.prototype.map
:
var newArray = otherArray.map(function(val) {
return typeof val === 'undefined' ? myArray.shift() : val;
});
请注意,这不会命中从未设置过的索引。
使用while
循环:
while (myArray.length > 0) {
var emptyIdx = otherArray.indexOf();
otherArray[emptyIdx] = myArray.shift();
}
编辑:好的,如果数组中的元素确实没有设置,就像它们在你的描述中那样,这些解决方案不会起作用,因为它们会跳过未设置的索引。这是一个可行的方法:
var myArray = [2, 4, 6, 8, 9];
var otherArray = [1, , 3, , 5, , 7];
var lastIdx = -1;
otherArray.forEach(function(val, idx) {
if (idx - lastIdx > 1) {
otherArray[idx - 1] = myArray.shift();
}
});
if (myArray.length > 0) {
otherArray = otherArray.concat(myArray);
}
document.body.innerHTML = otherArray;

答案 1 :(得分:2)
您可以遍历数组并检查未定义的值,如:
var otherArray = [1, , 3, , 5, , 7];
var myArray = [2, 4, 6];
for (var i = 0, j = 0; i < otherArray.length; i++) {
//check if a value is undefined
if (!otherArray[i]) {
//then change this value with the new from other array
otherArray[i] = myArray[j];
j++;
}
}
console.log(otherArray);//prints [1, 2, 3, 4, 5, 6, 7]
&#13;
答案 2 :(得分:0)
您可以使用递归,此函数将使用第二个项目填充第一个数组的undefined
个项目,直到它到达所使用的某个数组的末尾。
var otherArray = [1, , 3, , 5, , 7];
var myArray = [2, 4, 6];
function fillArray(ar1, ar2, i){
if (!i) i = 0;
if (!ar1[i]){
ar1[i] = ar2.shift();
}
if (++i < ar1.length && ar2.length > 0){
fillArray(ar1, ar2, i);
}
}
fillArray(otherArray, myArray); // this will update the content of originals arrays,
// use otherArray.slice() to get a copy.
document.getElementById("result").innerHTML = JSON.stringify(otherArray);
&#13;
<div id="result"></div>
&#13;
如果您要添加元素(因为myArray
中有其他项目且otherArray
中没有剩余空间),您可以更改条件以继续将&&
替换为{ {1}}
||