首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果我知道对象的一个字段的值,我如何从数组中删除一个对象?

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

Stack Overflow用户
提问于 2015-02-10 09:18:50
回答 2查看 54关注 0票数 1

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

我有一个测试对象数组:

代码语言:javascript
复制
 var tests;

每个测试对象都包含一个testId

如何使用testId = 25从数组tests中删除测试对象。我正在考虑一个for循环,但是有没有一个更干净的方法来做到这一点呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-02-10 09:22:52

最好的答案取决于您是否事先知道是否有最多一次匹配,或者可能不止一次(在后一种情况下,您是要删除所有匹配项还是仅删除第一项)。

删除所有匹配的

“最简单”的方法是使用filter,尽管严格地说这会产生一个没有匹配元素的新数组:

代码语言:javascript
复制
tests = tests.filter(function(e) {
    return e.testId !== 25;
});

这是可以的,除非其他代码保存了对原始数组的引用。

安全地“就地”修改数组似乎仍然需要将for循环与.splice结合起来。

代码语言:javascript
复制
for (var i = 0; i < tests.length; ) {   // nb: deliberate .length test
    if (tests[i].testId === 25) {
        tests.splice(i, 1);
    } else {
        ++i;
    }
}

“安全”警告是因为如果删除数组中的当前元素,迭代整个数组的函数方法将被混淆。在下面所示的“第一次匹配”方法中,这不是一个问题。

删除第一个(或仅)匹配

普通的for方法仍然非常简单(而且可能也是最有效的!)

代码语言:javascript
复制
for (var i = 0, n = tests.length; i < n; ++i) {
    if (tests[i].testId === 25) {
        tests.splice(i, 1);
        break;
    }
}

按照Johan的答案,.some方法可以迭代数组,然后在第一次匹配时退出(尽管有些人可能出于哲学理由反对布尔谓词函数,也可以对数组进行变异):

代码语言:javascript
复制
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的概括

代码语言:javascript
复制
var index = tests.findIndex(function(e) {
    return e.testId === 25;
});
if (index >= 0) {
    tests.splice(index, 1);
}
票数 3
EN

Stack Overflow用户

发布于 2015-02-10 09:35:55

一种方法是循环遍历所有对象,并将匹配的对象从数组中拼接出来。

我没有使用forEach,而是使用了一些(Objects/Array/some)。因为使用some,您可以通过返回true来“中断”循环,这样如果找到匹配项,就不需要遍历所有对象。

代码语言:javascript
复制
tests.some(function(testObject, index) {
    if (testObject.testId === 25) {
        tests.splice(index, 1);
        return true;
    }
});

或将其包装在函数中。

代码语言:javascript
复制
var removeObjectById = function(id) {
    tests.some(function(testObject, index) {
        if (testObject.testId === id) {
            tests.splice(index, 1);
            return true;
        }
    });
}

removeObjectById(25)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28427946

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档