【问题标题】:Js remove element from array without change the originaljs从数组中删除元素而不改变原来的
【发布时间】:2014-12-10 08:51:04
【问题描述】:

我想知道是否有一种方法可以做到这一点,而无需制作数组的完整副本然后拼接副本。

var arr = [{id:1, name:'name'},{id:2, name:'name'},{id:3, name:'name'}];

我需要通过他的索引临时删除元素并使用没有这个元素的数组,但我不想更改原始数组。

即使使用 lodash,你也可以让我让路。

【问题讨论】:

  • 检查'slice'方法:)

标签: javascript arrays


【解决方案1】:

Array.prototype.filter 将创建并返回一个由与谓词匹配的元素组成的新数组。

function removeByIndex(array, index) {
  return array.filter(function (el, i) {
    return index !== i;
  });
}

使用 ECMAScript 6 更短:

var removeByIndex = (array, index) => array.filter((_, i) => i !== index);

【讨论】:

  • 那不是改原版的吗?
  • @anguLaravel,不,它不会改变原始数组。
【解决方案2】:

您可以使用es6 spread operatorArray.prototype.splice

var arr = [{id:1, name:'name'},{id:2, name:'name'},{id:3, name:'name'}];

let newArr = [...arr]
newArr.splice(index)

展开运算符复制数组并拼接changes the contents of an array by removing or replacing existing elements and/or adding new elements

【讨论】:

    【解决方案3】:
    var arr = [{id:1, name:'name'},{id:2, name:'name'},{id:3, name:'name'}];
    var index = 1;
    var result = Array.prototype.concat(arr.slice(0, index), arr.slice(index + 1, arr.length));
    

    它合并了数组的左右部分,这里的分隔符就是要删除的元素。

    【讨论】:

    • 你也可以在这里传播,而不是使用 concat。 var result = [...arr.slice(1)]
    【解决方案4】:

    对我来说,使用扩展运算符似乎是删除没有突变的数组元素的更好选择:

    let fruits = ['peach', 'pear', 'apple', 'plum'];
    let result = [...fruits.slice(0, 2), ...fruits.slice(3)];
    
    console.log(fruits); // ['peach', 'pear', 'apple', 'plum']
    console.log(result); // ['peach', 'pear', 'plum']

    Source

    【讨论】:

      猜你喜欢
      • 2018-11-10
      • 2022-07-07
      • 1970-01-01
      • 2019-07-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-04
      • 2019-09-03
      • 2011-12-31
      相关资源
      最近更新 更多