从数组中按索引删除项目的较短方法

时间:2017-11-23 07:44:09

标签: javascript arrays

去年和今天我发了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

删除

4 个答案:

答案 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)。