从数组中按索引删除项目的更短方法[重复]

Posted

技术标签:

【中文标题】从数组中按索引删除项目的更短方法[重复]【英文标题】: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 【参考方案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)。

【讨论】:

以上是关于从数组中按索引删除项目的更短方法[重复]的主要内容,如果未能解决你的问题,请参考以下文章

动态获取当前方法名称的更短方法[重复]

React不会从数组中删除项目[重复]

如何删除数组中索引 X 处的项目? [复制]

如何在 C# 字典中按值索引过滤项目?

Powershell:使用许多文件名执行命令的更短方法?

从python中的更高目录导入[重复]