How to insert an item into an array at a specific index (JavaScript)?
我正在寻找一个javascript数组插入方法,其样式为:
1 | arr.insert(index, item) |
最好是在jquery中,但此时任何javascript实现都会这样做。
您需要的是本地数组对象上的
在本例中,我们将创建一个数组,并将一个元素添加到索引2中:
1 2 3 4 5 6 7 8 9 10 | var arr = []; arr[0] ="Jani"; arr[1] ="Hege"; arr[2] ="Stale"; arr[3] ="Kai Jim"; arr[4] ="Borge"; console.log(arr.join()); arr.splice(2, 0,"Lene"); console.log(arr.join()); |
您可以通过这样做来实现
1 2 3 | Array.prototype.insert = function ( index, item ) { this.splice( index, 0, item ); }; |
然后你可以像这样使用它:
1 2 3 4 | var arr = [ 'A', 'B', 'D', 'E' ]; arr.insert(2, 'C'); // => arr == [ 'A', 'B', 'C', 'D', 'E' ] |
除了拼接之外,您可以使用这种方法,这种方法不会改变原始数组,但会使用添加的项创建一个新数组。你应该尽可能避免变异。我在用ES6扩频器。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 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运算符,并在返回的结果中散布该运算符。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 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] |
自定义数组
1 2 3 4 5 6 7 8 | /* 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; }; |
它可以插入多个元素(与本机
1 2 | ["a","b","c","d"].insert(2,"X","Y","Z").slice(1, 6); // ["b","X","Y","Z","c"] |
2。支持数组类型参数合并和链接
1 2 3 4 5 6 7 8 9 10 | /* 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; }; |
它可以将参数中的数组与给定的数组合并,还支持链接:
1 2 | ["a","b","c","d"].insert(2,"V", ["W","X","Y"],"Z").join("-"); //"a-b-V-W-X-Y-Z-c-d" |
演示:http://jsfiddle.net/upphh/
如果您想一次将多个元素插入一个数组,请查看这个堆栈溢出答案:用JavaScript将数组拼接到数组中的更好方法
下面还有一些功能可以说明这两个示例:
1 2 3 4 5 6 7 8 9 | 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; } |
最后,这里是一个jsiddle,您可以自己查看它:http://jsiddle.net/luisperezphd/wc8as/
这就是你如何使用这些函数:
1 2 3 4 5 6 | // 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); |
为了实现正确的功能编程和链接目的,
1 2 3 4 5 6 7 | Array.prototype.insert = function(i,...rest){ this.splice(i,0,...rest) return this } var a = [3,4,8,9]; document.write("[cc lang="javascript"]" + JSON.stringify(a.insert(2,5,6,7)) +" |
号);>pre>
好吧,上面的
1 2 3 4 5 6 7 8 | 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)); |
我建议在这种情况下使用纯javascript,在javascript中也没有insert方法,但是我们有一个方法,它是一个内置的数组方法,可以为您完成这项工作,它被称为splice…
让我们看看什么是拼接()…
The splice() method changes the contents of an array by removing
existing elements and/or adding new elements.
好吧,假设我们有下面这个数组:
1 | const arr = [1, 2, 3, 4, 5]; |
我们可以这样删除
1 | arr.splice(arr.indexOf(3), 1); |
它将返回3,但如果我们现在检查ARR,我们有:
1 | [1, 2, 4, 5] |
到目前为止,还不错,但是我们如何使用拼接将新元素添加到数组中呢?让我们把3个放回ARR…
1 | arr.splice(2, 0, 3); |
让我们看看我们做了什么…
我们再次使用拼接,但这次对于第二个参数,我们传递0,意味着我们不想删除任何项,但同时,我们添加第三个参数,即将在第二个索引处添加的3…
您应该知道,我们可以同时删除和添加,例如现在我们可以:
1 | arr.splice(2, 2, 3); |
它将删除索引2处的2项,然后在索引2处添加3项,结果将是:
1 | [1, 2, 3, 5]; |
这显示了拼接中的每个项目是如何工作的:
array.splice(start, deleteCount, item1, item2, item3 ...)
在特定索引处附加单个元素
1 2 3 4 5 6 7 | //Append at specific position(here at index 1) arrName.splice(1, 0,'newName1'); //1: index number, 0: number of element to remove, newName1: new element //Append at specific position (here at index 3) arrName[3] = 'newName1'; |
在特定索引处附加多个元素
1 2 3 4 5 | //Append from index number 1 arrName.splice(1, 0,'newElemenet1', 'newElemenet2', 'newElemenet3'); //1: index number from where append start, //0: number of element to remove, //newElemenet1,2,3: new elements |
另一种可能的解决方案是使用
1 2 3 4 5 6 7 8 9 10 11 12 13 | var arr = ["apple","orange","raspberry"], arr2 = [1, 2, 4]; function insert(arr, item, index) { arr = arr.reduce(function(s, a, i) { i == index ? s.push(item, a) : s.push(a); return s; }, []); console.log(arr); } insert(arr,"banana", 1); insert(arr2, 3, 2); |
尽管已经回答了这个问题,我还是添加了这个注释,作为一种替代方法。
我想把已知数量的项目放入一个数组中,放入特定的位置,因为它们来自一个"关联数组"(即一个对象),根据定义,这个数组不能保证排序顺序。我希望得到的数组是一个对象数组,但是对象在数组中的顺序是特定的,因为数组保证了它们的顺序。所以我做到了。
首先是源对象,从PostgreSQL中检索到的JSONB字符串。我希望在每个子对象中按"order"属性对其进行排序。
1 2 3 | var jsonb_str = '{"one": {"abbr":"","order": 3},"two": {"abbr":"","order": 4},"three": {"abbr":"","order": 5},"initialize": {"abbr":"init","order": 1},"start": {"abbr":"","order": 2}}'; var jsonb_obj = JSON.parse(jsonb_str); |
因为对象中的节点数已知,所以我首先创建一个具有指定长度的数组:
1 2 | var obj_length = Object.keys(jsonb_obj).length; var sorted_array = new Array(obj_length); |
然后迭代对象,将新创建的临时对象放置到数组中所需的位置,而不真正进行任何"排序"。
1 2 3 4 5 6 7 8 9 | for (var key of Object.keys(jsonb_obj)) { var tobj = {}; tobj[key] = jsonb_obj[key].abbr; var position = jsonb_obj[key].order - 1; sorted_array[position] = tobj; } console.dir(sorted_array); |
我试过了,效果很好!
1 2 | var initialArr = ["India","China","Japan","USA"]; initialArr.splice(index, 0, item); |
index是要插入或删除元素的位置。0,即第二个参数定义要删除的索引中的元素数项是要在数组中创建的新项。它可以是一个或多个。
1 2 | initialArr.splice(2, 0,"Nigeria"); initialArr.splice(2, 0,"Australia","UK"); |
减持法利润如下:
1 2 3 4 5 | function insert(arr, val, index) { return index >= arr.length ? arr.concat(val) : arr.reduce((prev, x, i) => prev.concat(i === index ? [val, x] : x), []); } |
因此,通过这种方式,我们可以返回一个新的数组(这将是一种很酷的功能性方法,比使用push或splice要好得多),元素插入索引,如果索引大于数组的长度,它将插入到末尾。
任何一个仍然对这一个有问题,并尝试了以上所有的选择,但从来没有得到。我正在分享我的解决方案,这是为了考虑到您不希望显式地声明对象与数组的属性。
1 2 3 4 5 6 7 8 9 10 11 | function isIdentical(left, right){ return JSON.stringify(left) === JSON.stringify(right); } function contains(array, obj){ let count = 0; array.map((cur) => { if(this.isIdentical(cur, obj)) count++; }); return count > 0; } |
这是迭代引用数组并将其与要检查的对象进行比较的组合,将这两个数组都转换为字符串,然后在匹配时进行迭代。然后你就可以数数了。这是可以改进的,但这是我安顿下来的地方。希望这有帮助。
这是我在一个应用程序中使用的一个工作函数。
这将检查项目是否退出
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | let ifExist = (item, strings = [ '' ], position = 0) => { // output into an array with empty string. Important just in case their is no item. let output = [ '' ]; // check to see if the item that will be positioned exist. if (item) { // output should equal to array of strings. output = strings; // use splice in order to break the array. // use positition param to state where to put the item // and 0 is to not replace an index. Item is the actual item we are placing at the prescribed position. output.splice(position, 0, item); } //empty string is so we do not concatenate with comma or anything else. return output.join(""); }; |
然后我把它叫做下面。
1 2 3 | ifExist("friends", [ ' ( ', ' )' ], 1)} // output: ( friends ) ifExist("friends", [ ' - '], 1)} // output: - friends ifExist("friends", [ ':'], 0)} // output: friends: |