我想从0元素替换某些数组中的元素,另一个数组的元素具有可变长度。喜欢:
var arr = new Array(10), anotherArr = [1, 2, 3], result;
result = anotherArr.concat(arr);
result.splice(10, anotherArr.length);
有更好的方法吗?
答案 0 :(得分:46)
您可以使用splice
方法将数组的一部分替换为另一个数组中的项目,但您必须以特殊方式调用它,因为它需要将项目作为参数,而不是数组。
splice
方法需要(0, anotherArr.Length, 1, 2, 3)
之类的参数,因此您需要创建一个包含参数的数组,并使用apply
方法使用参数调用splice
方法:
Array.prototype.splice.apply(arr, [0, anotherArr.length].concat(anotherArr));
示例:
var arr = [ 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'];
var anotherArr = [ 1, 2, 3 ];
Array.prototype.splice.apply(arr, [0, anotherArr.length].concat(anotherArr));
console.log(arr);
输出:
[ 1, 2, 3, 'd', 'e', 'f', 'g', 'h', 'i', 'j']
答案 1 :(得分:26)
在ES6中,您只需执行一项操作即可将b.length
的{{1}}个元素替换为a
的元素:
b
在拼接长度中使用let a = [1, 2, 3, 4, 5]
let b = [10, 20, 30]
a.splice(0, b.length, ...b)
console.log(a) // -> [10, 20, 30, 4, 5]
(或a.length
)替换数组的整个内容也很有用:
Infinity
let a = [1, 2, 3, 4, 5]
let b = [10, 20, 30]
a.splice(0, a.length, ...b)
// or
// a.splice(0, Infinity, ...b)
console.log(a) // -> [10, 20, 30], which is the content of b
数组的内容将完全替换为a
内容。
注意:在我看来,阵列变异只应用于性能关键型应用程序,例如高FPS动画,以避免创建新阵列。通常我会创建一个维持不变性的新数组。
答案 2 :(得分:5)
对于任何想要在保留原始数组的同时用另一个数组的全部内容替换一个数组的整个内容的方法:
Array.prototype.replaceContents = function (array2) {
//make a clone of the 2nd array to avoid any referential weirdness
var newContent = array2.slice(0);
//empty the array
this.length = 0;
//push in the 2nd array
this.push.apply(this, newContent);
};
prototype函数将一个数组作为一个参数,它将作为新的数组内容,克隆它以避免任何奇怪的引用内容,清空原始数组,然后将传入的数组作为内容推送。这会保留原始数组和任何引用。
现在你可以这样做:
var arr1 = [1, 2, 3];
var arr2 = [3, 4, 5];
arr1.replaceContents(arr2);
我知道这不是最初问题的严格要求,但是当你在谷歌搜索时,这个问题首先出现,我认为其他人可能会觉得这很有用,因为这是我需要的答案。
答案 3 :(得分:5)
在ES6,TypeScript,Babel或类似产品中你可以这样做:
arr1.length = 0; // Clear your array
arr1.push(...arr2); // Push the second array using the spread opperator
简单。
答案 4 :(得分:3)
您可以使用splice,可以在删除旧元素的同时添加新元素:
var arr = new Array(10), anotherArr = [1, 2, 3];
arr.splice.apply(arr, [0, anotherArr.length].concat(anotherArr))
如果您不想修改arr
数组,可以使用slice返回数组的浅表副本:
var arr = new Array(10), anotherArr = [1, 2, 3], result = arr.slice(0);
result.splice.apply(result, [0, anotherArr.length].concat(anotherArr));
或者,您可以使用slice
切断第一个元素并在anotherArr
上添加top
:
result = anotherArr.concat(arr.slice(anotherArr.length));
答案 5 :(得分:1)
我不确定它是否是“更好”的方式,但至少它允许您选择起始索引(而您的解决方案仅适用于从索引0开始)。 Here's a fiddle.
// Clone the original array
var result = arr.slice(0);
// If original array is no longer needed, you can do with:
// var result = arr;
// Remove (anotherArr.length) elements starting from index 0
// and insert the elements from anotherArr into it
Array.prototype.splice.apply(result, [0, anotherArr.length].concat(anotherArr));
(Damnit,很多忍者。:-P)
答案 6 :(得分:1)
在这种情况下,您可以设置数组的长度。对于更复杂的案例,请参阅@ Guffa的答案。
var a = [1,2,3];
a.length = 10;
a; // [1, 2, 3, undefined x 7]
答案 7 :(得分:-2)
如果您只想将第一个数组的值复制到第二个数组中,请执行此操作
var secondArray = Object.assign([] ,firstArray);