Javascript 如何删除具有特定值的嵌套对象?
给定一个嵌套对象,如:Javascript 如何删除具有特定值的嵌套对象?,javascript,Javascript,给定一个嵌套对象,如: var x = { 'name': 'a', 'testObj': { 'blah': 8, 'testObj2': { // delete this obj 'blah2': 9, 'blah3': 'c' } }, 'level': 1, 'children': [{ 'name': 'b',
var x = {
'name': 'a',
'testObj': {
'blah': 8,
'testObj2': { // delete this obj
'blah2': 9,
'blah3': 'c'
}
},
'level': 1,
'children': [{
'name': 'b',
'level': 2,
'children': [{ // delete this obj
'name': 'c',
'level': 3
}]}]
};
如果嵌套对象包含在函数中指定的具有值(在我的示例中,字符串“c”)的属性,那么如何删除该对象?最终的结果是这样的:
var x = {
'name': 'a',
'testObj': {
'blah': 8,
},
'level': 1,
'children': [{
'name': 'b',
'level': 2,
'children': []}]
};
if (deleteObjByValue(x, 'c')) {
x = null; // or whatever you want to do
}
以下是我迄今为止的代码:
function recursiveIteration(obj, callback) {
var k;
if (obj instanceof Object) {
for (k in obj){
if (obj.hasOwnProperty(k)){
recursiveIteration( obj[k], callback );
}
}
} else {
callback(obj); // this is the non-object val
}
}
function deleteObjByValue(object, word) {
return recursiveIteration(object, function(val) {
if (word === val){
// here I want to delete the nested object (not the whole object) that contains the property with this val assigned to it
}else {
return false;
}
});
}
deleteObjByValue(x, 'c');
从对象中删除属性的正确方法是调用delete函数。因此,您需要在代码中进行一些重构,比如(未经测试):
从对象中删除属性的正确方法是调用delete函数。因此,您需要在代码中进行一些重构,比如(未经测试):
首先遍历对象中的属性,以检查是否应删除该对象。如果应该,则返回true,以便调用函数可以删除它(因为不能仅使用属性值删除属性)。如果不应将其删除,请循环查看作为对象的属性,以检查是否应删除其中的任何属性:
function deleteObjByValue(obj, value) {
var k;
for (k in obj){
if (obj.hasOwnProperty(k)){
if (obj[k] === value) {
return true;
}
}
}
for (k in obj){
if (obj.hasOwnProperty(k) && obj[k] instanceof Object){
if (deleteObjByValue(obj[k], value)) {
delete obj[k];
}
}
}
return false;
}
演示:
注意:如果主对象具有与该值匹配的属性,则函数不会删除任何内容。它将返回true
,表示整个对象应该消失。您可以这样处理它:
var x = {
'name': 'a',
'testObj': {
'blah': 8,
},
'level': 1,
'children': [{
'name': 'b',
'level': 2,
'children': []}]
};
if (deleteObjByValue(x, 'c')) {
x = null; // or whatever you want to do
}
首先遍历对象中的属性,以检查是否应删除该对象。如果应该,则返回true,以便调用函数可以删除它(因为不能仅使用属性值删除属性)。如果不应将其删除,请循环查看作为对象的属性,以检查是否应删除其中的任何属性:
function deleteObjByValue(obj, value) {
var k;
for (k in obj){
if (obj.hasOwnProperty(k)){
if (obj[k] === value) {
return true;
}
}
}
for (k in obj){
if (obj.hasOwnProperty(k) && obj[k] instanceof Object){
if (deleteObjByValue(obj[k], value)) {
delete obj[k];
}
}
}
return false;
}
演示:
注意:如果主对象具有与该值匹配的属性,则函数不会删除任何内容。它将返回true
,表示整个对象应该消失。您可以这样处理它:
var x = {
'name': 'a',
'testObj': {
'blah': 8,
},
'level': 1,
'children': [{
'name': 'b',
'level': 2,
'children': []}]
};
if (deleteObjByValue(x, 'c')) {
x = null; // or whatever you want to do
}
您需要保留对对象父对象的引用,以确定是否删除该对象 这里有一个解决方案:
function deleteParentByValue(object, object_parent, value) {
for (var x in object) {
if (object.hasOwnProperty(x)) {
if (typeof(object[x]) === 'object') {
deleteParentByValue(object[x], object, value);
} else {
if (object[x] == value) {
for (var z in object_parent) {
if (object_parent[z] == object) {
if (object_parent instanceof Array) {
object_parent.splice(object_parent.indexOf(z), 1);
} else {
delete object_parent[z];
}
}
}
break;
}
}
}
}
}
function deleteObjByValue(object, word) {
return deleteParentByValue(object, null, word);
}
您需要保留对对象父对象的引用,以确定是否删除该对象 这里有一个解决方案:
function deleteParentByValue(object, object_parent, value) {
for (var x in object) {
if (object.hasOwnProperty(x)) {
if (typeof(object[x]) === 'object') {
deleteParentByValue(object[x], object, value);
} else {
if (object[x] == value) {
for (var z in object_parent) {
if (object_parent[z] == object) {
if (object_parent instanceof Array) {
object_parent.splice(object_parent.indexOf(z), 1);
} else {
delete object_parent[z];
}
}
}
break;
}
}
}
}
}
function deleteObjByValue(object, word) {
return deleteParentByValue(object, null, word);
}
似乎没有删除键/值对所在的对象。@bloodyKnuckles是正确的,这将用于删除分配值的属性,但不删除包含值的父对象:似乎没有删除键/值对所在的对象。@bloodyKnuckles是正确的,这将用于删除指定值的属性,但不删除包含这些值的父对象: