如果我知道对象的一个​​字段的值,如何从数组中删除对象?

时间:2015-02-10 09:18:50

标签: javascript

我试图找出一些很好的例子,但似乎主要是4 - 5年前的例子,我想使用一个可以使用现代浏览器功能的解决方案。

我有一组测试对象:

 var tests;

每个测试对象都包含testId

如何从数组testId = 25中删除tests的测试对象。我在想一个for循环,但有更简洁的方法吗?

2 个答案:

答案 0 :(得分:3)

最佳答案取决于您是否事先知道是否最多只有一场比赛,或者可能多于一场(在后一种情况下,您是想要删除所有这些还是仅删除第一场)

删除所有匹配

最简单的"方法是使用filter,虽然严格来说会生成一个没有匹配元素的新数组:

tests = tests.filter(function(e) {
    return e.testId !== 25;
});

这没关系,除非其他代码持有对原始数组的引用。

安全地修改阵列"就地“#34;仍然需要for循环与.splice

的组合
for (var i = 0; i < tests.length; ) {   // nb: deliberate .length test
    if (tests[i].testId === 25) {
        tests.splice(i, 1);
    } else {
        ++i;
    }
}

&#34;安全&#34;警告是因为如果删除了数组中的当前元素,则遍历整个数组的函数方法将会混淆。这不是第一场比赛&#34;方法如下所示。

删除第一个(或仅限)匹配

普通for方法仍然非常简单(也可能效率最高!)

for (var i = 0, n = tests.length; i < n; ++i) {
    if (tests[i].testId === 25) {
        tests.splice(i, 1);
        break;
    }
}

每个Johan的答案的.some方法可以迭代一个数组,然后在第一个匹配时退出(尽管有些人可能会在哲学上反对布尔谓词函数也会改变数组):

var didRemove = tests.some(function(e, i, a) {
    if (e.testId === 25) {
        a.splice(i, 1);
        return true;   // causes the loop to exit
    }
});

在ES6草案中有.findIndex,这是.indexOf的概括:

var index = tests.findIndex(function(e) {
    return e.testId === 25;
});
if (index >= 0) {
    tests.splice(index, 1);
}

答案 1 :(得分:1)

一种方法是遍历所有对象并将匹配的对象拼接出数组。

而不是forEach我使用了一些(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/some)。因为使用某种方法,您可以通过返回true来“中断”循环,这样如果找到匹配项就不需要遍历所有对象。

tests.some(function(testObject, index) {
    if (testObject.testId === 25) {
        tests.splice(index, 1);
        return true;
    }
});

或将其包装在一个函数

var removeObjectById = function(id) {
    tests.some(function(testObject, index) {
        if (testObject.testId === id) {
            tests.splice(index, 1);
            return true;
        }
    });
}

removeObjectById(25)