如何从任何深度的嵌套javascript对象中删除属性?

ors*_*zky 4 javascript object lodash

假设我有嵌套对象,例如:

var obj = {
    "items":[
        {
            "name":"Item 1", 
            "value": "500",
            "options": [{...},{...}]
        },
        {
            "name":"Item 2", 
            "value": "300",
            "options": [{...},{...}]
        }
    ],
    "name": "Category",
    "options": [{...},{...}]
};
Run Code Online (Sandbox Code Playgroud)

我想从所有对象的任何深度删除选项属性。对象可以嵌套在对象内,也可以嵌套在数组内。

我们目前在项目中使用Lodash,但我对任何解决方案感到好奇。

voi*_*oid 6

没有实现此目的的直接方法,但是您可以使用以下功能从JSON中删除密钥。

function filterObject(obj, key) {
    for (var i in obj) {
        if (!obj.hasOwnProperty(i)) continue;
        if (typeof obj[i] == 'object') {
            filterObject(obj[i], key);
        } else if (i == key) {
            delete key;
        }
    }
    return obj;
}
Run Code Online (Sandbox Code Playgroud)

并像这样使用

var newObject = filterObject(old_json, "option");
Run Code Online (Sandbox Code Playgroud)

  • 嗯,我们的代码库处于严格模式,我收到以下错误:Uncaught SyntaxError: Delete of an unqualified identifier in strict mode。 (2认同)

Sum*_*nth 6

修改上述解决方案,删除在我的 JSON 中多次出现的“ dataID ”。下面提到的代码工作正常。

var candidate = {
  "__dataID__": "Y2FuZGlkYXRlOjkuOTI3NDE5MDExMDU0Mjc2",
  "identity": {
    "__dataID__": "aWRlbnRpdHk6NjRmcDR2cnhneGE3NGNoZA==",
    "name": "Sumanth Suvarnas"
  },  
};

candidate = removeProp(candidate, "__dataID__")

console.log(JSON.stringify(candidate, undefined, 2));

function removeProp(obj, propToDelete) {
   for (var property in obj) {
      if (typeof obj[property] == "object") {
         delete obj.property
         let newJsonData= this.removeProp(obj[property], propToDelete);
         obj[property]= newJsonData
      } else {
          if (property === propToDelete) {
            delete obj[property];
          }
        }
    }
    return obj
}
Run Code Online (Sandbox Code Playgroud)


小智 6

对 void 的答案进行一点修改,允许删除也是对象的属性

function filterObject(obj, key) {
    for (var i in obj) {
        if (!obj.hasOwnProperty(i)) continue;
        if (i == key) {
            delete obj[key];
        } else if (typeof obj[i] == 'object') {
            filterObject(obj[i], key);
        }
    }
    return obj;
}
Run Code Online (Sandbox Code Playgroud)