【问题标题】:Shorter way to remove an item by index from an array [duplicate]从数组中按索引删除项目的更短方法[重复]
【发布时间】:2018-05-07 02:19:00
【问题描述】:

我去年和今天都发了this 的帖子,我认为事情可以简化。

我需要通过索引从数组中删除一个项目。当按索引时,数组是否具有相同的值并不重要。你的典型例子:

let arr = [1,2,3,2,1] // just an array, not array with objects
let x = 1;

// This will not be an expected result:
// Find all values that is equal to 1 then remove
arr.filter(num => num !== x) //=> [2,3,2]

我的期望是当我删除最后一个元素(1)时,例如数组应该是[1,2,3,2]

let index = 4; // which is the last "1" in the array
let indexVal = arr.indexOf(4) // 1
let newArray = arr.splice(indexVal, 1) //=> [1,2,3,2]

现在是 2017 年,快到 18 年了,有没有更短的方法 (es5/6) 可以使用任何 polyfil?

编辑:

将此视为待办事项:

<ul>
  <li>me</li>
  <li>me</li> // click to delete this one
  <li>you</li>
  <li>me</li>
</ul>

要正确删除该项目,我必须删除 index 而不是 value

【问题讨论】:

  • 你为什么要在索引上调用indexOf
  • 你可以在一行中做到这一点arr.splice(arr.indexOf(4), 1))
  • @user2357112 请耐心等待,因为我仍然理解...返回类似于-1
  • 改用arr.filter((num, i) =&gt; i !== x);
  • @Sylar: array.splice(index, 1); 是按索引。这就是为什么它说index

标签: javascript arrays


【解决方案1】:

Array.filter 回调提供 2 个参数,数字和索引,您可以通过这种方式过滤数组。

let arr = [1,2,3,2,1] 
let x = 4; //suppose you want to remove element at 4th index

let editedArray = arr.filter((num, index) => index !== x) //editedArray = [1,2,3,2]

编辑:

第三个参数给出整个数组。感谢@Oliver 在评论中指出这一点

【讨论】:

  • 我在“玩”filter 但无法得到它,我忘记在索引中添加(val, index)。谢谢
  • 只是为了完成:过滤器函数还有第三个参数,您可以在其中获取当前操作的整个数组。
  • 最短版本:arr.filter((_, i) =&gt; i !== x)
【解决方案2】:
arr.splice(index, 1);

或者如果你特别想删除最后一个元素:

arr.pop();

没有indexOf 电话。 indexOf 电话本不应该在那里;它只是看起来有效,因为indexOf 为不存在的元素返回-1,而splice 将负索引视为从数组末尾开始计数。

另外,splice 会在原地修改数组并返回一个包含已删除元素的数组,因此按照您的方式分配其返回值会产生误导。

【讨论】:

  • 您可能需要添加 .splice().pop() 都返回已删除的元素,因此 let newArray = arr.splice(indexVal, 1) 实际上会生成 newArray = 1
  • 那么当我arr.length 时,金额是多少?我还没有尝试过。
  • @Sylar 由文档 .splice(indexFromWhichToStartRemoving,numberOfElementsToRemove) 提供,由于它改变了实际数组,因此它返回被删除的元素。 .pop() 删除数组的最后一个元素,同时改变数组并返回删除的 1 个元素。
  • @AnteJablanAdamović:应该是newArray = [1],而不是newArray = 1,但是是的,这值得一提。
  • 嗨。没有流行音乐。它需要灵活。将其视为具有相同值的待办事项列表,并且用户删除其中任何一个。只应删除已删除的 ;)
【解决方案3】:

我能想到的唯一方法就是我们每天在 Redux 中使用的那个:

const arr = [1, 2, 3, 2, 1]
const index = 4 // index of the item you want to remove
const newArr = [...arr.slice(0, index), ...arr.slice(index + 1)]
console.log(newArr) // [1, 2, 3, 2]

它可能不是最短的,但它更像是 2017 年,它是不可变的,这非常重要!

【讨论】:

    【解决方案4】:

    Ajay 的答案可能正是您想要的。无论如何,像我这样的人更喜欢稍微多行但更可读/可重写/可维护的解决方案,我会这样做:

    function removeElementByIndex(arr, x) {
        var newArr = [];
        for(var i = 0; i < arr.length; i++) {
            if(i != x) {
                newArr.push(arr[i]);
            }
        }
        return newArr;
    }
    // Usage
    removeElementByIndex([1, 2, 3, 2, 1], 4);// outputs: [1, 2, 3, 2]
    

    现在是 2017 年,快到 18 年了,有没有更短的方法 (es5/6) 这没有任何polyfil?

    哈哈!许多基本的东西还没有实现。我们将不得不等待 2118 或其他编程语言来取代 JS(哦等等,有一个,又名 jQuery :P)。

    【讨论】:

      猜你喜欢
      • 2021-12-06
      • 1970-01-01
      • 1970-01-01
      • 2016-04-22
      • 1970-01-01
      • 2021-11-06
      • 2015-07-27
      • 1970-01-01
      相关资源
      最近更新 更多