如何将一个项目插入到特定索引的数组中?
我正在寻找一个JavaScript数组插入方法,风格如下:
arr.insert(index, item)
最好在jQuery中,但任何Javascript实现将在这一点上做。
你想要的是本地数组对象上的splice
函数。
arr.splice(index, 0, item);
将item
插入到指定索引的arr
中(首先删除0
项目,也就是插入)。
在这个例子中,我们将创build一个数组并添加一个元素到索引2中:
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());
上面的代码的输出将是:
Jani,Hege,Stale,Kai Jim,Borge Jani,Hege,Lene,Stale,Kai Jim,Borge
你可以通过这个来实现Array.insert方法:
Array.prototype.insert = function ( index, item ) { this.splice( index, 0, item ); };
那么你可以像这样使用它:
var arr = [ 'A', 'B', 'D', 'E' ]; arr.insert(2, 'C'); // => arr == [ 'A', 'B', 'C', 'D', 'E' ]
自定义数组insert
方法
1.有多重论据和链接支持
/* 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"]
2.用数组types的参数合并和链接支持
/* 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("-"); // "abVWXYZcd"
DEMO: http : //jsfiddle.net/UPphH/
如果你想一次插入多个元素到一个数组中检查出这个堆栈溢出答案: 一个更好的方法拼接到一个数组的数组在JavaScript中
这里也有一些function来说明这两个例子:
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/
这就是你如何使用这个function:
// 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);
除了拼接,你可以使用这种方法不会改变原始数组,但会创build一个新的数组与添加项目。 只要有可能,你通常应该避免突变。 我在这里使用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]
为了正确的函数编程和链接, Array.prototype.insert()
的发明是必不可less的。 事实上,如果它返回了变异数组而不是完全没有意义的空数组,它实际上可能是完美的。 所以在这里
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>");
这个:
var arr= ["India","China","Japan","USA"]; arr.splice(index, 0, item);
将项目插入指定index
arr
(首先删除0个项目,即它只是一个插入)。
尽pipe这已经得到了回答,但我还是增加了一个备选方法。
我想把一个已知数量的项目放到一个数组中,当它们脱离一个“关联数组”(即一个对象)时,它们的定义并不保证是按sorting顺序排列的。 我希望得到的数组是一个对象数组,但是由于数组保证了它们的顺序,因此对象将在数组中以特定顺序排列。 所以我做了这个..
首先是源对象,一个从PostgreSQL检索的JSONBstring。 我想通过每个子对象中的“order”属性对它进行sorting。
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);
由于对象中的节点数是已知的,我首先创build一个具有指定长度的数组:
var obj_length = Object.keys(jsonb_obj).length; var sorted_array = new Array(obj_length);
然后迭代该对象,将新创build的临时对象放入数组中的所需位置,而不进行任何“sorting”。
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);
另一个可能的解决scheme,使用Array#reduce
。
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);
我试过这个,它工作正常!
var initialArr = ["India","China","Japan","USA"]; initialArr.splice(index, 0, item);
索引是要插入或删除元素的位置。 0即第二个参数定义要删除的索引中的元素的数量项是你想要在数组中创build的新条目。 它可以是一个或多个。
initialArr.splice(2, 0, "Nigeria"); initialArr.splice(2, 0, "Australia","UK");