我去年和今天发过这篇文章,我认为事情可以简化.
我需要通过索引从数组中删除一个项目.当通过索引时,数组是否具有相同的值并不重要.你的典型例子:
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)
要正确删除该项目,我必须删除index
notvalue
该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在评论中指出这一点
arr.splice(index, 1);
Run Code Online (Sandbox Code Playgroud)
或者如果您特别想要删除最后一个元素:
arr.pop();
Run Code Online (Sandbox Code Playgroud)
没有indexOf
电话.该indexOf
电话不应该一直存在; 它只是看起来像它工作,因为indexOf
返回-1
一个不存在的元素,并将splice
负索引视为从数组的末尾开始计数.
此外,splice
修改数组并返回一个已删除元素的数组,因此以您的方式分配其返回值会产生误导.