我正在尋找一種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));