从数组中按索引删除项目的更短方法[重复]
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) => 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) => 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)。
【讨论】:
以上是关于从数组中按索引删除项目的更短方法[重复]的主要内容,如果未能解决你的问题,请参考以下文章