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

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

arr.insert(index, item)

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

逆天西里2020/03/09 13:25:16

采取减少收益的方法如下:

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更好),并且如果索引大于数组的长度,则将其插入在末尾。

西里阳光2020/03/09 13:25:16

线程有点旧,但是我必须同意上面的Redu,因为拼接肯定有一些令人困惑的接口。cdbajorin给出的响应是:“仅当第二个参数为0时,它才返回一个空数组。如果它大于0,则它返回从数组中删除的项目”,这是正确的。该函数的目的是进行拼接,或者如Jakob Keller先前所述,“进行连接或连接,也进行更改。您现在要更改的已建立数组将涉及添加或删除元素。...”返回的元素的值(如果有的话)充其量是尴尬的。我100%同意,如果此方法返回了看起来很自然的结果,那么它可能会更适合于链接,这是一个添加了拼接元素的新数组。然后,您可以对返回的数组执行[[19“,” 17“]。splice(1,0,” 18“)。join(” ...“)之类的操作。它返回已删除内容的事实只是个废话恕我直言。如果该方法的目的是“切出一组元素”,那仅仅是目的。似乎,如果我不知道要切出的内容,可能没有什么理由要切掉那些元素,不是吗?如果它的行为像concat,map,reduce,slice等,那将是更好的选择,其中从现有数组中创建一个新数组,而不是对现有数组进行突变。这些都是可链接的,这是一个重要的问题。链数组操作相当普遍。似乎该语言需要朝着另一个方向发展,并尽可能地坚持下去。Javascript具有功能性且声明性较差,这似乎是对规范的奇怪偏离。

米亚卡卡西L2020/03/09 13:25:16

我试过了,它工作正常!

var initialArr = ["India","China","Japan","USA"];
initialArr.splice(index, 0, item);

索引是您要插入或删除元素的位置。0,即第二个参数定义要删除的索引中元素的数量。item是要在数组中创建的新条目。可以是一个或多个。

initialArr.splice(2, 0, "Nigeria");
initialArr.splice(2, 0, "Australia","UK");
十三村村蛋蛋2020/03/09 13:25:16

任何仍然对此有疑问并尝试过上述所有选项却从未获得过它的人。我正在分享我的解决方案,这是要考虑到您不想显式地声明对象与数组的属性。

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;
}

这是对引用数组进行迭代并将其与要检查的对象进行比较的组合,将它们都转换为字符串,然后在匹配时进行迭代。然后,您可以数数。可以改进,但这是我解决的地方。希望这可以帮助。

LEYJim2020/03/09 13:25:16

我建议在这种情况下使用纯JavaScriptJavaScript中也没有insert方法,但是我们有一个 内置的Array方法,它可以为您完成工作,它称为splice ...。

让我们看看什么是splice() ...

splice()方法通过删除现有元素和/或添加新元素来更改数组的内容。

好吧,假设我们下面有这个数组:

const arr = [1, 2, 3, 4, 5];

我们可以这样删除3

arr.splice(arr.indexOf(3), 1);

它将返回3,但是如果现在检查arr,我们将:

[1, 2, 4, 5]

到目前为止,一切都很好,但是如何使用拼接将新元素添加到数组中呢?让我们把3放回去...

arr.splice(2, 0, 3);

让我们看看我们做了什么...

我们再次使用了splice,但是这次我们为第二个参数传递了0,这意味着我们不希望删除任何项目,但是与此同时,我们添加了第三个参数3,它将在第二个索引处添加...

您应该知道,我们可以同时删除添加,例如现在我们可以:

arr.splice(2, 2, 3);

这将删除索引2处的2个项目,然后在索引2处添加3,结果将是:

[1, 2, 3, 5];

这显示了拼接中的每个项目如何工作:

array.splice(start,deleteCount,item1,item2,item3 ...)

梅A飞云2020/03/09 13:25:16

另一种可能的解决方案,使用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);

阿飞宝儿猴子2020/03/09 13:25:16

您想要的是splice本机数组对象上的函数。

arr.splice(index, 0, item);将插入itemarr指定的索引处(0首先删除项目,也就是插入)。

在此示例中,我们将创建一个数组并将一个元素添加到索引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());

逆天西里2020/03/09 13:25:16

除了拼接以外,您可以使用这种方法,该方法不会突变原始数组,但是会使用添加的项创建一个新数组。通常应尽可能避免突变。我在这里使用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]

通过稍微调整函数以将rest运算符用于新项目,可以将其添加到多个项目中,并将其也分散到返回的结果中

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]

2020/03/09 13:25:16

如果您想一次将多个元素插入到数组中,请查看此Stack Overflow答案:在JavaScript中将数组拼接为数组的更好方法

另外,这里有一些函数来说明这两个示例:

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/

这就是您使用这些功能的方式:

// 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);
蛋蛋LEY2020/03/09 13:25:16

自定义数组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.具有数组类型参数合并和链接支持

/* 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("-");
// "a-b-V-W-X-Y-Z-c-d"

演示: http : //jsfiddle.net/UPphH/