Javascript - 按值删除数组项[重复]

Posted

技术标签:

【中文标题】Javascript - 按值删除数组项[重复]【英文标题】:Javascript - remove an array item by value [duplicate] 【发布时间】:2011-10-31 20:32:27 【问题描述】:

我的情况:

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

我该怎么做?

【问题讨论】:

我认为问题标题应该是“JS - 在 javascript 中按值删除数组元素” @kta 是的!你使用了你的心智能力,标题自己改了。魔术。 @User2 :我确实相信魔法,但在这种情况下,作者在我写下我的第一条评论后更改了问题标题。:) 另见:Remove item from array by value 和 Remove specific element from an array? 【参考方案1】:

你会想要使用 JavaScript 的 Array splice method:

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);

P.S.有关酷炫的~ 波浪号快捷方式的说明,请参阅此帖子:

Using a ~ tilde with indexOf to check for the existence of an item in an array.


注意: IE .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 $.inArray 使用它只需。您可以改用this polyfill。

【讨论】:

安全网+1。 我不会仅仅为此而包含 jQuery。 MDN docs 中提供了一个简单的 indexOf 函数 正是我需要的。真的谢谢约瑟夫;) 如 cmets 中提到的使用波浪号的链接解释...不要使用波浪号。不清楚基本上没有好处。 波浪号并不酷。不可维护的代码并不酷!【参考方案2】:

如果您要经常使用它(并且在多个数组上),请扩展 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 希望返回 new array 并删除元素。返回新数组会很好。【参考方案3】:
tag_story.splice(tag_story.indexOf(id_tag), 1);

【讨论】:

仔细看问题,他好像是要从数组中取出一个值,而不是一个索引。 @Peter 删除索引会删除关联的值。 @Ispuk 那么你应该accept Eli's answer。 这段代码很危险!如果没有找到id_tag 的值,它将删除数组中的最后一项!!您必须首先检查是否找到了id_tag。看我的回答。 @Ispuk:这是一个非常糟糕的习惯。您永远不应该仅仅因为“它可以满足我的需要”而使用代码。你应该仔细考虑每一行代码的后果!!!【参考方案4】:

我喜欢使用过滤器:

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;
    
);

【讨论】:

如果您在回调中return x;,那么filter 也将delete where Boolean(id_tag) = false。我认为这是无意的。 快捷方式:id_tag = id_tag.filter(x => x !== 90);【参考方案5】:

作为变体

delete array[array.indexOf(item)];

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

【讨论】:

不是一个好的解决方案,如果你使用delete关键字,你最终会在数组中有一个undefined元素。 这实际上正是我所需要的。与 array.forEach 一起,我可以轻松地遍历定义的不确定性。 请注意,删除会炸毁 IE8 或更低版本...【参考方案6】:
function removeValue(arr, value) 
    for(var i = 0; i < arr.length; i++) 
        if(arr[i] === value) 
            arr.splice(i, 1);
            break;
        
    
    return arr;

可以这样调用:

removeValue(tag_story, 90);

【讨论】:

这不像我预期的那样工作...... Eli 代码正是我需要的,但它在 IE 上不起作用,检查并检查你的代码,它们不一样工作:( ... 这不会返回新数组... @AndreFigueiredo 谢谢,我已经编辑修复它。【参考方案7】:

以下是我使用的一些辅助函数:

Array.contains = function (arr, key) 
    for (var i = arr.length; i--;) 
        if (arr[i] === key) return true;
    
    return false;
;

Array.add = function (arr, key, value) 
    for (var i = arr.length; i--;) 
        if (arr[i] === key) return arr[key] = value;
    
    this.push(key);
;

Array.remove = function (arr, key) 
    for (var i = arr.length; i--;) 
        if (arr[i] === key) return arr.splice(i, 1);
    
;

【讨论】:

OP 想要返回新数组。他不想返回删除的值..【参考方案8】:

您需要使用.indexOf().splice()。比如:

tag_story.splice(tag_story.indexOf(90),1);

【讨论】:

【参考方案9】:

你可以使用 lodash.js

_.pull(arrayName,valueToBeRemove);

在您的情况下:- _.pull(id_tag,90);

【讨论】:

请为您的答案添加一些解释,并可能添加指向您的来源的链接。 希望这可能对来自 [lodash documnetation](lodash.com/docs#pull) 的 @Andre 有所帮助【参考方案10】:
var id_tag = [1,2,3,78,5,6,7,8,47,34,90]; 
var delete_where_id_tag = 90
    id_tag =id_tag.filter((x)=> x!=delete_where_id_tag); 

【讨论】:

以上是关于Javascript - 按值删除数组项[重复]的主要内容,如果未能解决你的问题,请参考以下文章

按值删除数组项[重复]

按值删除数组项[重复]

按值删除数组项[重复]

leetcode 删除数组中的重复项

leetcode 删除数组中的重复项

LeetCode ( 26 ) ---[删除有序数组中的重复项](Java)