44

我想将某个数组中的元素从 0 元素替换为另一个长度可变的数组的元素。喜欢:

var arr = new Array(10), anotherArr = [1, 2, 3], result;
result = anotherArr.concat(arr);
result.splice(10, anotherArr.length);

有没有更好的方法?

4

7 回答 7

61

您可以使用该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']

演示:http: //jsfiddle.net/Guffa/bB7Ey/

于 2013-07-07T10:38:06.060 回答
52

在具有单个操作的 ES6 中,您可以这样做以将 的第一个b.length元素替换为 的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.lengthInfinity

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内容将完全被b内容替换。

注意 1:在我看来,数组突变应该只用于性能关键的应用程序,例如高 FPS 动画,以避免创建新数组。通常我会创建一个保持不变性的新数组。

注意2:如果b是一个非常大的数组,不建议使用这种方法,因为...b它是分散在 的参数中的splice,并且JS函数可以接受的参数数量有限制。在这种情况下,我鼓励使用另一种方法(或创建一个新数组,如果可能的话!)。

于 2017-01-20T11:48:19.060 回答
10

在 ES6、TypeScript、Babel 或类似的你可以这样做:

arr1.length = 0; // Clear your array
arr1.push(...arr2); // Push the second array using the spread opperator

简单的。

于 2016-12-06T20:38:40.963 回答
6

对于正在寻找一种方法来用另一个数组的全部内容替换一个数组的全部内容同时保留原始数组的任何人:

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);
};

原型函数将一个数组作为参数,它将作为新的数组内容,克隆它以避免任何奇怪的引用内容,清空原始数组,然后将传入的数组作为内容推入。这会保留原始数组和任何引用。

现在您可以简单地执行此操作:

var arr1 = [1, 2, 3];
var arr2 = [3, 4, 5];
arr1.replaceContents(arr2);

我知道这并不是最初的问题,但是当你在谷歌搜索时,这个问题首先出现,我认为其他人可能会觉得这很有帮助,因为这是我需要的答案。

于 2016-02-18T20:24:26.557 回答
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切断第一个元素并添加anotherArron top

result = anotherArr.concat(arr.slice(anotherArr.length));
于 2013-07-07T10:38:49.867 回答
1

我不确定这是否是一种“更好”的方式,但至少它允许您选择起始索引(而您的解决方案只能从索引 0 开始)。这是一个小提琴。

// 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));

(该死,这么多忍者。:-P)

于 2013-07-07T10:39:27.517 回答
1

在这种情况下,您可以只设置数组的长度。对于更复杂的情况,请参阅@Guffa 的答案。

var a = [1,2,3];
a.length = 10;
a; // [1, 2, 3, undefined x 7]
于 2013-07-07T10:39:47.843 回答