如何在特定索引(JavaScript)的数组中插入项目?

我正在寻找一种JavaScript数组插入方法,其样式为: javascript

arr.insert(index, item)

最好是在jQuery中,但此时任何JavaScript实现均可以。 java


#1楼

若是您想一次将多个元素插入到数组中,请查看此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);

#2楼

您能够经过执行如下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' ]

#3楼

自定义数组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同样)并支持连接: ui

["a", "b", "c", "d"].insert(2, "X", "Y", "Z").slice(1, 6);
// ["b", "X", "Y", "Z", "c"]

2.具备数组类型参数合并和连接支持

/* 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/


#4楼

即便已经回答了这个问题,我仍在添加此注释,以供选择。

我想将已知数量的项目放置到数组中的特定位置,由于它们来自“关联数组”(即对象),而根据定义,这些“数组”不能保证按排序的顺序排列。 我但愿结果数组是对象数组,可是对象要按数组中的特定顺序排列,由于数组能够保证它们的顺序。 因此我作到了。

首先是源对象,即从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);

#5楼

为了进行适当的功能编程和连接, 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));