我正在寻找一种JavaScript数组插入方法,其样式为: javascript
arr.insert(index, item)
最好是在jQuery中,但此时任何JavaScript实现均可以。 java
若是您想一次将多个元素插入到数组中,请查看此Stack Overflow答案: 将数组拼接成JavaScript中数组的更好方法 编程
另外,这里有一些函数来讲明这两个示例: json
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/ 数组
这就是您使用这些功能的方式: app
// 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);
您能够经过执行如下Array.insert
来实现Array.insert
方法: ide
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
方法 /* 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
同样)并支持连接: ui
["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; };
它能够将参数中的数组与给定数组合并,还支持连接: this
["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/
即便已经回答了这个问题,我仍在添加此注释,以供选择。
我想将已知数量的项目放置到数组中的特定位置,由于它们来自“关联数组”(即对象),而根据定义,这些“数组”不能保证按排序的顺序排列。 我但愿结果数组是对象数组,可是对象要按数组中的特定顺序排列,由于数组能够保证它们的顺序。 因此我作到了。
首先是源对象,即从PostgreSQL检索的JSONB字符串。 我想按每一个子对象中的“ order”属性对其进行排序。
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);
因为对象中的节点数是已知的,所以我首先建立一个具备指定长度的数组:
var obj_length = Object.keys(jsonb_obj).length; var sorted_array = new Array(obj_length);
而后迭代对象,将新建立的临时对象放置到数组中的所需位置,而不会发生任何真正的“排序”。
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);
为了进行适当的功能编程和连接, Array.prototype.insert()
的发明必不可少。 若是拼接返回了变异数组而不是彻底没有意义的空数组,则实际上拼接多是完美的。 因此就这样
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));