去年和今天我发了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
答案 0 :(得分:7)
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在评论中指出这一点
答案 1 :(得分:5)
arr.splice(index, 1);
或者如果您特别想删除最后一个元素:
arr.pop();
没有indexOf
来电。 indexOf
来电永远不应该在那里;它只是看起来有效,因为indexOf
返回-1
表示不存在的元素,splice
将负指数视为从数组末尾开始计数。
此外,splice
修改数组并返回一个已删除元素的数组,因此以您的方式分配其返回值会产生误导。
答案 2 :(得分: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年,它是不可变的,这非常重要!
答案 3 :(得分:1)
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?
LOL!许多基本的东西还没有实现。我们将不得不等待2118或其他编程语言来取代JS(哦等等,有一个,也就是jQuery:P)。