我如何从递归 $.each 中的对象中删除元素
How i can delete elements from object in recursive $.each?
例如,我有这个数据对象:
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;
};
我在JsFiddle上的例子。
谢谢。
您可以通过两个步骤创建它:首先找到任何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);
Array.prototype.filter 非常适合这样的问题。此代码应生成您要查找的内容:
data.some = data.some.filter(function(item) {
return item.info.filter(function(i) {
return i.next > 0;
}).length > 0;
});
更新:请参阅本页上安德鲁的答案。这是一个更清洁、更安全的解决方案。
简而言之,你不能。相反,您必须使用带有索引的常规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--;
}
}
}
});
});
使用 for while 长度大于零,并从 array
的属性
我不太清楚应该删除什么,但如果是所有东西,第一个关键是"下一个,更改这个:
if (some2['id'] == next['next'])
对此:
if (some2[0] == 'next')
工作演示
呵呵,
-泰德
相关文章:
- 在不知道深度或父属性的情况下从对象中删除属性
- 解析JSON并从中删除对象会出错
- 如何从对象中删除属性
- 在特定条件下从存储在localStorage中的阵列中删除对象
- Es6:能够在设置/更新/删除对象属性时调用自定义方法
- AngularJS:删除重复的对象并按值对数组进行重新排序
- 正在从对象中删除值
- 正在从列表中删除对象
- 删除对象时终止setInterval
- jQuery-检测选择对象是否添加或删除了选项
- 如何在不删除类似侦听器的情况下从父对象中删除jQuery事件侦听器
- 为什么没有从数组中存在的对象中删除属性
- 从Three.js场景中删除许多对象的速度较慢
- 删除两个独立对象中的属性,而不使用多余的删除语句
- JS:将 EventListener 添加到动态创建的 DOM 对象中,这些对象删除 parentNode
- Java 脚本 json 解析对象:删除操作后不删除“,”
- JavaScript对象删除特定键值中的引号
- tinyMCE对象删除事件触发器
- javascript地图对象删除不工作
- Javascript对象删除元素