我有一个javascript对象数组:每个对象都包含键/值对。我正在尝试遍历此数组,并删除任何对象,其特定键的值(例如“Industry”)无法与给定值匹配。这是我的代码,由于某种原因,它没有遍历整个数组,我认为这与我删除一个项目时循环计数器以某种方式拙劣的事实有关:
var industry = 'testing';
var i = 0;
for (i = 0; i < assets_results.length; i++) {
var asset = assets_results[i];
var asset_industry = asset['industry'];
if (industry != asset_industry) { assets_results.splice(i,1); }
}
有什么想法吗?提前谢谢。
答案 0 :(得分:1)
这是因为当你拼接一个元素时,数组的大小减少一个。拼接后的所有元素都将一个位置移动到数组的开头并填充拼接空间。所以代码错过了一个元素。试试这段代码。
var industry = 'testing';
var i = 0;
for (i = 0; i < assets_results.length; i++) {
var asset = assets_results[i];
var asset_industry = asset['industry'];
if (industry != asset_industry) {
assets_results.splice(i,1);
i--;
}
}
答案 1 :(得分:0)
splice从数组中删除一个元素并调整其大小:
var arra = ['A', 'B', 'C', 'D'];
arr.splice(1,2); // -> ['A', 'D'];
这意味着你在拼接时不应该增加i,因为你跳过了下一个元素。拼接会使i + 2元素成为i + 1元素。
var industry = 'testing';
for (var i = 0, max = assets_results.length; i < max; ) { // Accessing a property is expensive.
if (industry != assets_results[i]['industry']) {
assets_results.splice(i,1);
} else {
++i;
}
}
答案 2 :(得分:0)
在迭代对象时修改对象时,这是一个常见问题。避免此问题的最佳方法是,如果测试失败,则不要从现有数组中删除对,创建新数组,只有在通过测试时才添加对。
var industry = 'testing';
var i = 0;
var asset_results_filtered = [];
for (i = 0; i < assets_results.length; i++) {
if (industry == assets_results[i]) {
asset_results_filtered.push(assets_results[i]);
}
}
编辑:您的代码看起来有点不合逻辑 - 我修改了示例以使用给定的变量。
答案 3 :(得分:0)
请改为尝试:
var industry = 'testing';
var i = assets_results.length - 1;
for (; i > 0; i--) {
var asset = assets_results[i],
asset_industry = asset['industry'];
if (industry != asset_industry) { assets_results.splice(i,1); }
}