Javascript - 按值删除数组项

IT技术 javascript arrays
2021-03-11 10:24:48

我的情况:

var id_tag = [1,2,3,78,5,6,7,8,47,34,90];

我想delete where id_tag = 90并返回:

var id_tag = [1,2,3,78,5,6,7,8,47,34];

我怎样才能做到这一点?

6个回答

你会想要使用 JavaScript 的Arraysplice方法

var tag_story = [1,3,56,6,8,90],
    id_tag = 90,
    position = tag_story.indexOf(id_tag);

if ( ~position ) tag_story.splice(position, 1);

PS有关那个很酷的~波浪号快捷方式的解释,请参阅这篇文章:

使用~波浪号 withindexOf检查数组中是否存在某项


注意: IE < 9 不支持.indexOf()数组。如果你想确保你的代码在 IE 中工作,你应该使用 jQuery 的$.inArray()

var tag_story = [1,3,56,6,8,90],
    id_tag = 90,
    position = $.inArray(id_tag, tag_story);

if ( ~position ) tag_story.splice(position, 1);

如果您想支持 IE < 9 但页面上还没有 jQuery,则无需将其用于$.inArray. 你可以改用这个 polyfill

波浪号不酷。不可维护的代码并不酷!
2021-04-22 10:24:48
我不会仅仅为此包含 jQuery。MDN 文档中提供了一个简单的 indexOf 函数
2021-04-23 10:24:48
正如对使用波浪号的链接解释的评论中所述......不要使用波浪号。目前还不清楚,基本上没有任何好处。
2021-04-25 10:24:48
正是我需要的。真的谢谢约瑟夫 ;)
2021-04-30 10:24:48
+1 为安全网。
2021-05-07 10:24:48

如果您要经常使用它(并且在多个数组上),请扩展 Array 对象以创建一个未设置的函数。

Array.prototype.unset = function(value) {
    if(this.indexOf(value) != -1) { // Make sure the value exists
        this.splice(this.indexOf(value), 1);
    }   
}

tag_story.unset(56)
不利于扩展原生 JS 对象。另外,OP想返回新数组与删除的元素..这将是很好返回新数组..
2021-05-16 10:24:48
tag_story.splice(tag_story.indexOf(id_tag), 1);
@Ispuk 那么你应该接受 Eli 的回答
2021-04-16 10:24:48
@Ispuk:这是一个非常坏的习惯。你永远不应该仅仅因为“它满足我的需要”就使用代码。你应该仔细考虑每一行代码的后果!!!
2021-04-19 10:24:48
@Peter 删除索引会删除关联的值。
2021-04-20 10:24:48
仔细看问题,看起来他想从数组中删除一个值,而不是一个索引。
2021-04-23 10:24:48
这段代码很危险!如果id_tag没有找到的值,它将删除数组中的最后一项!!您必须首先检查是否id_tag找到了。看我的回答。
2021-04-28 10:24:48

我喜欢使用过滤器:

var id_tag = [1,2,3,78,5,6,7,8,47,34,90];

// delete where id_tag = 90
id_tag = id_tag.filter(function(x) {
    if (x !== 90) {
      return x;
    }
});
简短的方法: id_tag = id_tag.filter(x => x !== 90);
2021-04-21 10:24:48
如果你return x;在回调然后filter也会delete where Boolean(id_tag) = false我认为这是无意的。
2021-05-08 10:24:48

作为变种

delete array[array.indexOf(item)];

如果您对delete运算符一无所知,请不要使用此.

不是一个好的解决方案,如果您使用delete关键字,您最终将undefined在数组中拥有一个元素。
2021-04-16 10:24:48
只是提醒一下,删除会炸毁 IE8 或更低版本......
2021-05-02 10:24:48
这实际上正是我所需要的。与 array.forEach 一起,我可以轻松地循环遍历已定义的 indecis。
2021-05-03 10:24:48