1

我有一个 javascript 对象数组:每个对​​象都包含键/值对。我正在尝试遍历此数组,并删除其特定键的值(例如“行业”)与给定值不匹配的任何对象。这是我的代码,由于某种原因,它没有遍历整个数组,我认为这与以下事实有关:当我删除一个项目时,循环计数器以某种方式被搞砸了:

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); }

}   

有任何想法吗?提前致谢。

4

4 回答 4

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--;
    }

} 
于 2013-07-23T11:18:49.320 回答
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;
    }
}   
于 2013-07-23T11:18:16.087 回答
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]);
    }
}

编辑:您的代码看起来有点不合逻辑——我修改了示例以使用给定的变量。

于 2013-07-23T11:19:28.620 回答
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); }

}
于 2013-07-23T11:22:32.930 回答