我试图找出一些很好的例子,但似乎主要是4 - 5年前的例子,我想使用一个可以使用现代浏览器功能的解决方案。
我有一组测试对象:
var tests;
每个测试对象都包含testId
。
如何从数组testId = 25
中删除tests
的测试对象。我在想一个for循环,但有更简洁的方法吗?
答案 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)