Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 按索引从数组中删除项的较短方法_Javascript_Arrays - Fatal编程技术网

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

Javascript 按索引从数组中删除项的较短方法,javascript,arrays,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(

我去年发了一篇文章,今天,我想事情可以简化

我需要从数组中删除一个项,但要按索引删除。按索引排序时,数组是否具有相同的值并不重要。你的典型例子是:

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]:

现在是2017年,快到2018年了,没有任何polyfil,有没有更快捷的es5/6方法

编辑:

将此视为一项任务:

<ul>
  <li>me</li>
  <li>me</li> // click to delete this one
  <li>you</li>
  <li>me</li>
</ul>
要正确删除该项,我必须按索引而不是值删除数组。filter回调提供了两个参数,number和index,您可以通过这种方式过滤数组

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在评论中指出这一点。Array.filter回调提供了两个参数,number和index,您可以通过这种方式过滤数组

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]
arr.splice(index, 1);
编辑:

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

arr.splice(index, 1);
或者,如果您特别想删除最后一个元素:

arr.pop();
没有索引调用。indexOf调用永远不应该出现在那里;它看起来只是工作了,因为对于不存在的元素,indexOf返回-1,而splice将负索引视为从数组末尾开始计数

此外,splice会就地修改数组并返回一个已删除元素的数组,因此按您的方式指定其返回值会产生误导

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

arr.pop();
没有索引调用。indexOf调用永远不应该出现在那里;它看起来只是工作了,因为对于不存在的元素,indexOf返回-1,而splice将负索引视为从数组末尾开始计数


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

我能想到的唯一方法是我们每天在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]

它可能不是最短的,但它更短,它是不变的,这是非常重要的

我能想到的唯一方法是我们每天在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]

它可能不是最短的,但它更短,它是不变的,这是非常重要的

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年,快到2018年了,还有比es5/6更短的方法吗 这是不含聚菲的吗


哈哈!许多基本的事情还没有实现。我们将不得不等待2118或其他编程语言来取代JS哦,等等,有一种,也称为jQuery:P。

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年,快到2018年了,还有比es5/6更短的方法吗 这是不含聚菲的吗


哈哈!许多基本的事情还没有实现。我们将不得不等待2118或其他编程语言来取代JS哦,等等,有一种,也称为jQuery:P。

为什么要在索引上调用indexOf?可以在一行arr.spitearr.indexOf4中执行此操作,1@user2357112请容忍我,因为我仍然理解。。。返回类似-1Try arr.filternum的值,i=>i!==x;相反,@Sylar:array.stipleindex,1;这是索引。这就是为什么它会显示index为什么你要在索引上调用indexOf?你可以在一行arr.paticearr.indexOf4中这样做,1@user2357112请容忍我,因为我仍然理解。。。返回类似-1Try arr.filternum的值,i=>i!==x;相反,@Sylar:array.stipleindex,1;这是索引。这就是为什么它会显示索引。我在玩过滤器,但无法获得它,我忘了添加索引val,index。感谢您的完成:filter函数还有第三个参数,您可以从中获取当前操作的整个阵列。最短版本:arr.filter,i=>i!==席正在玩滤镜,但没能得到,我忘了在索引VAL中加上索引。感谢您的完成:filter函数还有第三个参数,您可以从中获取当前操作的整个阵列。最短版本:arr.filter,i=>i!==XY您可能希望添加.splice和.pop返回删除的元素,因此让newArray=arr.spliceindexVal,1将实际使newArray=1So,当我arr.length时,数量是多少?我还没有尝试过这个方法。@Sylar根据文档.stipleIndexFromwhichToStartRemoving,numberOfElementsToRemove,由于它改变了实际数组,所以返回了被删除的元素。pop删除数组的最后一个元素,也会对数组进行变异,并返回1个删除的元素。@AnteJablanAdamović:应该是newArray=[1],不是newArray=1,但是是的,这值得一提。嗨。没有流行音乐。它需要灵活。可以将其视为一个有
相同的值,用户将删除其中一个。只删除已删除的一个;您可能需要添加.splice和.pop返回删除的元素,因此让newArray=arr.spliceindexVal,1将实际使newArray=1So,当我arr.length时,数量是多少?我还没有尝试过这个方法。@Sylar根据文档.stipleIndexFromwhichToStartRemoving,numberOfElementsToRemove,由于它改变了实际数组,所以返回了被删除的元素。pop删除数组的最后一个元素,也会对数组进行变异,并返回1个删除的元素。@AnteJablanAdamović:应该是newArray=[1],不是newArray=1,但是是的,这值得一提。嗨。没有流行音乐。它需要灵活。可以将其视为具有相同值的待办事项列表,用户可以删除其中任何一项。只删除已删除的一个;