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 - 按值删除数组项[重复]的主要内容,如果未能解决你的问题,请参考以下文章