arr.insert(index, item)
最好使用jQuery,但目前任何JavaScript实现都可以。
arr.insert(index, item)
您想要在原生数组对象上使用 splice
函数。
arr.splice(index, 0, item);
将会在指定的 index
处将 item
插入到 arr
中(首先删除 0
个元素,也就是仅插入)。
在这个示例中,我们将创建一个数组,并将一个元素添加到索引为 2 的位置:
var arr = [];
arr[0] = "Jani";
arr[1] = "Hege";
arr[2] = "Stale";
arr[3] = "Kai Jim";
arr[4] = "Borge";
console.log(arr.join()); // Jani,Hege,Stale,Kai Jim,Borge
arr.splice(2, 0, "Lene");
console.log(arr.join()); // Jani,Hege,Lene,Stale,Kai Jim,Borge
arr.splice(2,3)
会从索引2开始删除3个元素,如果没有传递第三个到第n个参数,则不会插入任何元素。因此,insert()
这个名称也不太准确。 - EBarr你可以通过以下方式实现 Array.insert
方法:
Array.prototype.insert = function ( index, ...items ) {
this.splice( index, 0, ...items );
};
那么你可以像这样使用它:
var arr = [ 'A', 'B', 'E' ];
arr.insert(2, 'C', 'D');
// => arr == [ 'A', 'B', 'C', 'D', 'E' ]
Array.prototype.insert = function (index, items) { this.splice.apply(this, [index, 0].concat(items)); }
。 - Ryan Smithfor(i in arr) {...}
时,该函数将显示为元素。 - rep_movsd除了splice外,您可以使用此方法,它不会更改原始数组,但它将创建一个具有添加的项目的新数组。当需要避免突变时,这很有用。我在这里使用ES6扩展运算符。
const items = [1, 2, 3, 4, 5]
const insert = (arr, index, newItem) => [
// part of the array before the specified index
...arr.slice(0, index),
// inserted item
newItem,
// part of the array after the specified index
...arr.slice(index)
]
const result = insert(items, 1, 10)
console.log(result)
// [1, 10, 2, 3, 4, 5]
通过调整函数,使用rest运算符来添加新项目,然后在返回的结果中将其展开,可以使用此方法添加多个项目:
const items = [1, 2, 3, 4, 5]
const insert = (arr, index, ...newItems) => [
// part of the array before the specified index
...arr.slice(0, index),
// inserted items
...newItems,
// part of the array after the specified index
...arr.slice(index)
]
const result = insert(items, 1, 10, 20)
console.log(result)
// [1, 10, 20, 2, 3, 4, 5]
splice()
之前调用slice()
。永远不要为此类琐事使用ES6,因为可以使用其他API更好、更清晰地完成。 - Jack Gslice()
会分配一个新的数组,而且 splice()
也会分配一个新的数组,因为它返回被移除的项组成的数组(在这种情况下,是一个空数组)。对这些情况进行基准测试表明,splice()
更快(大约快30%),但我们每秒执行数百万次操作,所以除非你的应用程序在紧密循环中执行了 很多 这样的操作,否则不会有任何差异。 - nickf插入
方法/* Syntax:
array.insert(index, value1, value2, ..., valueN) */
Array.prototype.insert = function(index) {
this.splice.apply(this, [index, 0].concat(
Array.prototype.slice.call(arguments, 1)));
return this;
};
它可以像本地的 splice
方法一样插入多个元素,并支持链式操作:
["a", "b", "c", "d"].insert(2, "X", "Y", "Z").slice(1, 6);
// ["b", "X", "Y", "Z", "c"]
/* Syntax:
array.insert(index, value1, value2, ..., valueN) */
Array.prototype.insert = function(index) {
index = Math.min(index, this.length);
arguments.length > 1
&& this.splice.apply(this, [index, 0].concat([].pop.call(arguments)))
&& this.insert.apply(this, arguments);
return this;
};
["a", "b", "c", "d"].insert(2, "V", ["W", "X", "Y"], "Z").join("-");
// "a-b-V-W-X-Y-Z-c-d"
["b", "X", "Y", "Z", "c"]
。为什么没有包括"d"
?在我的理解中,如果你把slice()
的第二个参数设置为6,并且从指定的索引开始有6个元素,那么你应该得到返回值中的所有6个元素。(文档中称其为howMany
参数。)https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/splice - Alexis Wilke["a", "b", "c", "d"].insert(2, "X", "Y", "Z").slice(3, 3);
=> [ ]
- Alexis Wilkeslice
方法而不是你在评论中提到的 splice
。slice
的第二个参数(名为 end
)是“从哪里结束提取”的基于零的索引。slice
提取直到但不包括 end
。因此,在 insert
之后,您有 ["a", "b", "X", "Y", "Z", "c", "d"]
,从中 slice
提取从 "b"
到 "d"
但不包括 "d"
的索引为 1
到 6
的元素。这有意义吗? - VisioNArray.prototype.splice()
是一种优雅的方法来实现它。
const numbers = ['one', 'two', 'four', 'five']
numbers.splice(2, 0, 'three');
console.log(numbers)
了解更多关于Array.prototype.splice的信息
如果你想一次性插入多个元素到一个数组中,请看一下这个Stack Overflow的答案:A better way to splice an array into an array in javascript
以下是两个示例函数:
function insertAt(array, index) {
var arrayToInsert = Array.prototype.splice.apply(arguments, [2]);
return insertArrayAt(array, index, arrayToInsert);
}
function insertArrayAt(array, index, arrayToInsert) {
Array.prototype.splice.apply(array, [index, 0].concat(arrayToInsert));
return array;
}
最后附上一个 jsFiddle,你可以自己查看:http://jsfiddle.net/luisperezphd/Wc8aS/
以下是如何使用这些函数:
// if you want to insert specific values whether constants or variables:
insertAt(arr, 1, "x", "y", "z");
// OR if you have an array:
var arrToInsert = ["x", "y", "z"];
insertArrayAt(arr, 1, arrToInsert);
qml
中使用它。 - S Atsplice()
来实现splice()
方法通常在添加元素时接收三个参数:
0
let array = ['item 1', 'item 2', 'item 3']
let insertAtIndex = 0
let itemsToRemove = 0
array.splice(insertAtIndex, itemsToRemove, 'insert this string at index 0')
console.log(array)
今天(2020年4月24日),我为大型和小型数组选择的解决方案进行了测试。我在Chrome 81.0、Safari 13.1和Firefox 75.0上测试了它们,使用的操作系统是macOS v10.13.6(High Sierra)。
对于所有浏览器:
slice
和reduce
(D、E、F)的非原地解决方案通常比原地解决方案快10倍至100倍。splice
的原地解决方案(AI、BI和CI)最快(有时快约100倍-但这取决于数组大小)。测试分为两组:原地解决方案(AI、BI和CI)和非原地解决方案(D、E和F),并分别针对两种情况进行了测试:
测试代码在下面的代码段中呈现:
function AI(arr, i, el) {
arr.splice(i, 0, el);
return arr;
}
function BI(arr, i, el) {
Array.prototype.splice.apply(arr, [i, 0, el]);
return arr;
}
function CI(arr, i, el) {
Array.prototype.splice.call(arr, i, 0, el);
return arr;
}
function D(arr, i, el) {
return arr.slice(0, i).concat(el, arr.slice(i));
}
function E(arr, i, el) {
return [...arr.slice(0, i), el, ...arr.slice(i)]
}
function F(arr, i, el) {
return arr.reduce((s, a, j)=> (j-i ? s.push(a) : s.push(el, a), s), []);
}
// -------------
// TEST
// -------------
let arr = ["a", "b", "c", "d", "e", "f"];
let log = (n, f) => {
let a = f([...arr], 3, "NEW");
console.log(`${n}: [${a}]`);
};
log('AI', AI);
log('BI', BI);
log('CI', CI);
log('D', D);
log('E', E);
log('F', F);
This snippet only presents tested code (it not perform tests)
以下是谷歌浏览器上一个小数组的示例结果:
为了实现适当的函数式编程和链式调用,Array.prototype.insert()
的发明是必不可少的。事实上,如果splice
函数返回被改变后的数组而不是完全无意义的空数组,那它本来就很完美。
Array.prototype.insert = function(i,...rest){
this.splice(i,0,...rest)
return this
}
var a = [3,4,8,9];
document.write("<pre>" + JSON.stringify(a.insert(2,5,6,7)) + "</pre>");
好的,那么上面提到的使用Array.prototype.splice()
方法会改变原始数组,一些人可能会抱怨说“你不应该修改不属于你的东西”,这也可能是正确的。因此,为了公共福利,我想提供另一个Array.prototype.insert()
方法,它不会改变原始数组。下面是代码:
Array.prototype.insert = function(i,...rest){
return this.slice(0,i).concat(rest,this.slice(i));
}
var a = [3,4,8,9],
b = a.insert(2,5,6,7);
console.log(JSON.stringify(a));
console.log(JSON.stringify(b));
splice
改变了原始数组,我认为“适当的函数式编程”不应该与 splice
混在一起。 - chrisbajorin在这种情况下,我建议使用纯JavaScript。此外,JavaScript中没有插入方法,但我们有一种内置的Array方法可以胜任此工作。它被称为splice...
让我们看看splice()是什么...
splice()方法通过删除现有元素和/或添加新元素来更改数组的内容。
好的,假设我们有以下数组:
const arr = [1, 2, 3, 4, 5];
我们可以这样移除3
:
arr.splice(arr.indexOf(3), 1);
它将返回3,但如果我们现在检查arr,我们会得到:[1, 2, 4, 5]
目前为止,一切都很好,但我们如何使用splice向数组中添加一个新元素呢?
让我们把3放回到数组中...
arr.splice(2, 0, 3);
让我们来看看我们已经做了什么......
我们再次使用 splice,但这一次作为第二个参数,我们传递了0,意味着我们不想删除任何项,但同时,我们添加了一个第三个参数,即3将被添加到第二个索引处...
您应该知道我们可以同时进行删除和添加。例如,现在我们可以这样做:
arr.splice(2, 2, 3);
这将删除索引2上的两个项目。然后在索引2处添加3,结果将会是:
[1, 2, 3, 5];
这里展示了每个 splice 中的参数作用:
array.splice(start, deleteCount, item1, item2, item3 ...)