有什么方法能够从像 JavaScript 数组,从该数组中删除项目︰

var ary = ['three', 'seven', 'eleven'];

然后我而执行所示的函数︰

removeItem('seven', ary);

我已了解到splice() ,但仅移除位置数,我需要要删除项目,方法的值的东西。

2010-10-17 17:43:34

回答:

如果不允许添加到本机的原型,这可以是全局函数或自定义对象的方法。它从匹配函数的参数的数组中移除所有项。

Array.prototype.remove = function() {
    var what, a = arguments, L = a.length, ax;
    while (L && this.length) {
        what = a[--L];
        while ((ax = this.indexOf(what)) !== -1) {
            this.splice(ax, 1);
        }
    }
    return this;
};

var ary = ['three', 'seven', 'eleven'];

ary.remove('seven');

/*  returned value: (Array)
three,eleven
*/

若要使其成为全球的

function removeA(arr) {
    var what, a = arguments, L = a.length, ax;
    while (L > 1 && arr.length) {
        what = a[--L];
        while ((ax= arr.indexOf(what)) !== -1) {
            arr.splice(ax, 1);
        }
    }
    return arr;
}
var ary = ['three', 'seven', 'eleven'];
removeA(ary, 'seven');


/*  returned value: (Array)
three,eleven
*/

并以安抚 IE8 的和更低的

if(!Array.prototype.indexOf) {
    Array.prototype.indexOf = function(what, i) {
        i = i || 0;
        var L = this.length;
        while (i < L) {
            if(this[i] === what) return i;
            ++i;
        }
        return -1;
    };
}

@xorinzor.prototype 属性不对,是跨浏览器。

永远不能更改数组的原型。有趣的事情开始发生。

@madeinstefano,一个或两个示例的有趣 (不好) 的事情会发生这种情况吗?

OMGLOL,一个使用接头...从数组在一个循环中移除项的多个开机自检这个世界是注定会。

人们为什么显示示例将添加到该数组原型?学习好的做法是堆栈溢出

要寻找indexOf方法
例如︰

var index = array.indexOf(item);
array.splice(index, 1);

请注意,您将需要添加它的 IE 8 及以下。

和索引不是-1时对其循环

最好要做检查以只拼接如果不同-1,有数以百万计的选项类似,明智的选择jsperf.com/not-vs-gt-vs-ge/4

如果您使用 jquery,您可以使用$.inArray代替indexOf,即跨浏览器兼容。

检查stackoverflow.com/questions/5767325/...

请确保 index!==(-1),即存在数组中的项,否则将拼接出数组中的最后一个元素。

您可以使用underscore.js它真正使事情简单。

例如,替换为︰

var result = _.without(['three','seven','eleven'], 'seven');

result将是['three','eleven'].

用例中,您将需要编写的代码是︰

ary = _.without(ary, 'seven')

它减少了您编写的代码。

我从未说过不使用库中的其他位置。如果代码看上去更干净我不介意包括库。人们为什么使用 jquery,为什么不使用原始的 javascript 然后?

Underscore.js 节拍蝙蝠侠的实用程序带。

@vatsal-因为库开发人员可以专注于使后面的库函数功能快速、 简洁和跨浏览器,虽然我可以将精力集中在我的应用程序和它的用途。它保存我思考时间,以便我有额外的时间来使应用程序更好地并不担心小函数,构成我的应用程序。有人已经发明了的轮子,为什么会有人重新进行其每次他们构建汽车吗?

你开尔文我完全同意您。某人有放置注释和他以后删除,他所说,使用类似下划线库并不酷,我们不应接受这种答案。我当时为了回答这一问题。

一行式命令将做到这一点,

var ary = ['three', 'seven', 'eleven'];

// Remove item 'seven' from array
var filteredAry = ary.filter(function(e){return e!=='seven'})

    ==> ["three", "eleven"]

// In ECMA6 (arrow function syntax):
var filteredAry = ary.filter(e => e!=='seven')

我相信也将成为此中的 ECMA6.ary.filter (e = > e ! '7' = =)

也许添加说明什么代码是应该做的事情

想知道这奇妙的单行式命令没有得到更多的爱。+ 1 任何循环。一个可以添加多个值,他想要通过删除&&的值。

请注意,这应作为array = array.filter(),而不仅仅是array.filter().

用 @JeffreyRoosendaal 贡献更新答案 (filter() does not mutate the array on which it is called.developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/... ).

签出通过这种方式︰

for(var i in ary){
    if(ary[i]=='seven'){
        ary.splice(i,1);
        break;
        }
}

和函数中︰

function removeItem(array, item){
    for(var i in array){
        if(array[i]==item){
            array.splice(i,1);
            break;
            }
    }
}

removeItem(ary, 'seven');

非常干净 !这是完全符合 IE 的吗?

保持一点如果修改此代码,不"分页符",一直循环下去,若要删除多个项目,您将需要重新计算 i 变量右后接头,如下所示︰ i。这是因为只是收缩阵列并将得到否则跳过的元素。

添加到我上面的评论,该代码就会︰ 为 (var i = 0; 我 < array.length; i + +) {/ * 等。...* / array.splice(i,1);i;

内容来源于Stack Overflow Remove item from array by value
请输入您的翻译

Remove item from array by value

确认取消