例如,我有这个数据对象:
var data = {
'some': [
{'id': 10, 'info': [{'next': 11}, {'next': 0}, {'next': 0}, {'next': 0}]},
{'id': 11, 'info': [{'next': 0}, {'next': 0}, {'next': 0}, {'next': 0}]},
{'id': 12, 'info': [{'next': 0}, {'next': 0}, {'next': 20}, {'next': 0}]},
{'id': 13, 'info': [{'next': 0}, {'next': 0}, {'next': 0}, {'next': 0}]},
{'id': 14, 'info': [{'next': 12}, {'next': 0}, {'next': 0}, {'next': 0}]},
{'id': 15, 'info': [{'next': 0}, {'next': 0}, {'next': 0}, {'next': 0}]},
{'id': 16, 'info': [{'next': 0}, {'next': 0}, {'next': 0}, {'next': 14}]},
{'id': 17, 'info': [{'next': 0}, {'next': 0}, {'next': 13}, {'next': 0}]},
{'id': 18, 'info': [{'next': 15}, {'next': 0}, {'next': 0}, {'next': 0}]},
{'id': 19, 'info': [{'next': 0}, {'next': 0}, {'next': 0}, {'next': 0}]},
{'id': 19, 'info': [{'next': 0}, {'next': 0}, {'next': 0}, {'next': 11}]},
{'id': 20, 'info': [{'next': 0}, {'next': 0}, {'next': 0}, {'next': 0}]}
]
};
我想删除id
所有元素,其中包含next
,例如,来自上面的数据对象,我希望得到类似这样的内容
var data = {
'some': [
{'id': 10, 'info': [{'next': 11}, {'next': 0}, {'next': 0}, {'next': 0}]},
{'id': 16, 'info': [{'next': 0}, {'next': 0}, {'next': 0}, {'next': 14}]},
{'id': 17, 'info': [{'next': 0}, {'next': 0}, {'next': 13}, {'next': 0}]},
{'id': 18, 'info': [{'next': 15}, {'next': 0}, {'next': 0}, {'next': 0}]},
{'id': 19, 'info': [{'next': 0}, {'next': 0}, {'next': 0}, {'next': 0}]},
{'id': 19, 'info': [{'next': 0}, {'next': 0}, {'next': 0}, {'next': 11}]},
]
};
我写这个脚本,但它返回Uncaught TypeError: Cannot read property 'id' of undefined
,为什么?
var cleanData = function(d
ata) {
$.each(data['some'], function (_is, some) {
$.each(some['info'], function (_in, next) {
if (next['next'])
$.each(data['some'], function (_is2, some2) {
if (some2['id'] == next['next'])
data['some'].remove(_is2);
});
});
});
return data;
};
感谢。
答案 0 :(得分:1)
更新:See Andrew's answer on this page.这是一个更清洁,更安全的解决方案。
总之,你不能。您必须使用带索引的常规for
循环,以便您可以跟上数组的新长度。
$.each(data['some'], function (_is, some) {
$.each(some['info'], function (_in, next) {
if (next['next'])
for(var i=0, len=data['some'].length; i < len; i++) {
var some2 = data['some'][i];
if (some2['id'] == next['next']) {
data['some'].remove(_is2);
// Decrement i since the next item will now be in the place of the one you removed.
i--;
// Decrement len since your array now holds one less item.
len--;
}
}
}
});
});
答案 1 :(得分:1)
Array.prototype.filter非常适合这样的问题。这段代码应该产生你想要的东西:
data.some = data.some.filter(function(item) {
return item.info.filter(function(i) {
return i.next > 0;
}).length > 0;
});
答案 2 :(得分:1)
您可以分两步创建:首先查找任何next
对象中包含的所有ID。然后过滤数组并删除具有该ID的行。
示例:
// Build ids table
var idsToRemove = data.some.reduce(function(ids, row) {
return row.info.reduce(function(ids, obj) {
return ids[obj.next] = true, ids;
}, ids);
}, {});
// Filter out rows with those IDs
data.some = data.some.filter(function(row) {
return !idsToRemove[row.id];
});
console.log(data);
var data = {
'some': [
{'id': 10, 'info': [{'next': 11}, {'next': 0}, {'next': 0}, {'next': 0}]},
{'id': 11, 'info': [{'next': 0}, {'next': 0}, {'next': 0}, {'next': 0}]},
{'id': 12, 'info': [{'next': 0}, {'next': 0}, {'next': 20}, {'next': 0}]},
{'id': 13, 'info': [{'next': 0}, {'next': 0}, {'next': 0}, {'next': 0}]},
{'id': 14, 'info': [{'next': 12}, {'next': 0}, {'next': 0}, {'next': 0}]},
{'id': 15, 'info': [{'next': 0}, {'next': 0}, {'next': 0}, {'next': 0}]},
{'id': 16, 'info': [{'next': 0}, {'next': 0}, {'next': 0}, {'next': 14}]},
{'id': 17, 'info': [{'next': 0}, {'next': 0}, {'next': 13}, {'next': 0}]},
{'id': 18, 'info': [{'next': 15}, {'next': 0}, {'next': 0}, {'next': 0}]},
{'id': 19, 'info': [{'next': 0}, {'next': 0}, {'next': 0}, {'next': 0}]},
{'id': 19, 'info': [{'next': 0}, {'next': 0}, {'next': 0}, {'next': 11}]},
{'id': 20, 'info': [{'next': 0}, {'next': 0}, {'next': 0}, {'next': 0}]}
]
};
// Build ids table
var ids = data.some.reduce(function(ids, row) {
return row.info.reduce(function(ids, obj) {
return ids[obj.next] = true, ids;
}, ids);
}, {});
// Filter out rows with those IDs
data.some = data.some.filter(function(row) {
return !ids[row.id];
});
console.log(data);
答案 3 :(得分:0)
使用for while长度大于零并从数组
中删除索引1答案 4 :(得分:0)
你得到的错误是因为并非数组中的每个对象都有一个键为'id'的属性
我不清楚应该删除的是什么,但是如果它的第一个关键是“下一个”,请更改:
if (some2['id'] == next['next'])
到此:
if (some2[0] == 'next')
HTH,
-Ted