我得出的结论是,这几乎是不可能的。在下面的图片中,我试图用36 的键删除对象,而不知道其父级的密钥。
我能够使用以下函数找到36键的对象(其中o是对象,id是键),但是,我无法看到删除来自对象的子对象。
function findById(o, id) {
//Early return
if( o.id === id ){
return o;
}
var result, p;
for (p in o) {
if( o.hasOwnProperty(p) && typeof o[p] === 'object' ) {
result = findById(o[p], id);
if(result){
return result;
}
}
}
return result;
}
在寻找另一种解决方案之前,我想我也可以问一下SO编程社区的专家。
[更新]
解决方案实际上非常简单(见下面的答案)。我没有意识到递归的第一级o [p]是对实际对象的引用,这意味着delete o[p]
将它从实际对象中删除。
答案 0 :(得分:1)
如果你能找到它,你可以找到它的父母。如果您可以找到其父级,则可以删除您要查找的密钥。你可以修改你的功能来做到这一点。它会在成功时返回true
。
function deleteId(o, id) {
if(o.hasOwnProperty(id)) {
return delete o[id];
}
var p;
for(p in o) {
if(o.hasOwnProperty(p) && typeof o[p] === 'object') {
var success = deleteId(o[p], id);
if(success) {
return true;
}
}
}
return false;
}
答案 1 :(得分:0)
您应该返回包含该对象的对象,而不是返回具有该id的对象,而该对象确实可用。类似的东西:
"none"
答案 2 :(得分:0)
将replacer
参数用于JSON.stringify
:
JSON.parse(JSON.stringify(input, function(key, value) {
return key === '36' ? undefined : value;
}));