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

Syl*_*lar 1 javascript arrays

我去年和今天发过这篇文章,我认为事情可以简化.

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

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]
Run Code Online (Sandbox Code Playgroud)

我的期望是当我删除最后一个元素(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]
Run Code Online (Sandbox Code Playgroud)

现在,它是2017年,差不多'18,是否有更短的方式(es5/6)这样做没有任何polyfil?

编辑:

把它想象成一个待办事项:

<ul>
  <li>me</li>
  <li>me</li> // click to delete this one
  <li>you</li>
  <li>me</li>
</ul>
Run Code Online (Sandbox Code Playgroud)

要正确删除该项目,我必须删除indexnotvalue

Aja*_*aur 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]
Run Code Online (Sandbox Code Playgroud)

编辑:

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

  • 只是为了完成:过滤器功能还有第三个参数,您可以在其中获得当前正在操作的整个阵列. (2认同)

use*_*ica 5

arr.splice(index, 1);
Run Code Online (Sandbox Code Playgroud)

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

arr.pop();
Run Code Online (Sandbox Code Playgroud)

没有indexOf电话.该indexOf电话不应该一直存在; 它只是看起来像它工作,因为indexOf返回-1一个不存在的元素,并将splice负索引视为从数组的末尾开始计数.

此外,splice修改数组并返回一个已删除元素的数组,因此以您的方式分配其返回值会产生误导.