使用JavaScript以递归方式从对象中删除属性和值的最快方法是什么?

Leo*_*ill 11 javascript recursion object javascript-objects

我需要找到$meta从对象中删除所有属性及其值的最快方法,例如:

{
  "part_one": {
    "name": "My Name",
    "something": "123",
    "$meta": {
      "test": "test123"
    }
  },
  "part_two": [
    {
      "name": "name",
      "dob": "dob",
      "$meta": {
        "something": "else",
        "and": "more"
      }
    },
    {
      "name": "name",
      "dob": "dob"
    }
  ],
  "$meta": {
    "one": 1,
    "two": 2
  }
}
Run Code Online (Sandbox Code Playgroud)

应该成为以下内容,因为$meta属性可能位于对象中的任何位置,因此可能需要某种形式的递归.

{
  "part_one": {
    "name": "My Name",
    "something": "123"
  },
  "part_two": [
    {
      "name": "name",
      "dob": "dob"
    },
    {
      "name": "name",
      "dob": "dob"
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

任何帮助或建议将不胜感激!

谢谢!

Jos*_*kle 27

一个简单的自我调用功能就可以做到.

function removeMeta(obj) {
  for(prop in obj) {
    if (prop === '$meta')
      delete obj[prop];
    else if (typeof obj[prop] === 'object')
      removeMeta(obj[prop]);
  }
}
Run Code Online (Sandbox Code Playgroud)

var myObj = {
  "part_one": {
    "name": "My Name",
    "something": "123",
    "$meta": {
      "test": "test123"
    }
  },
  "part_two": [
    {
      "name": "name",
      "dob": "dob",
      "$meta": {
        "something": "else",
        "and": "more"
      }
    },
    {
      "name": "name",
      "dob": "dob"
    }
  ],
  "$meta": {
    "one": 1,
    "two": 2
  }
}

function removeMeta(obj) {
  for(prop in obj) {
    if (prop === '$meta')
      delete obj[prop];
    else if (typeof obj[prop] === 'object')
      removeMeta(obj[prop]);
  }
}

removeMeta(myObj);

console.log(myObj);
Run Code Online (Sandbox Code Playgroud)

  • 直到JS具有尾递归优化,这对于大型对象是不安全的.对于具有循环引用的对象,它也是不安全的. (2认同)

Kyl*_*yle 15

// Helper function
function removeProps(obj,keys){
  if(obj instanceof Array){
    obj.forEach(function(item){
      removeProps(item,keys)
    });
  }
  else if(typeof obj === 'object'){
    Object.getOwnPropertyNames(obj).forEach(function(key){
      if(keys.indexOf(key) !== -1)delete obj[key];
      else removeProps(obj[key],keys);
    });
  }
}
// The object we want to iterate
var obj = {
  "part_one": {
    "name": "My Name",
    "something": "123",
    "$meta": {
      "test": "test123"
    }
  },
  "part_two": [
    {
      "name": "name",
      "dob": "dob",
      "$meta": {
        "something": "else",
        "and": "more"
      }
    },
    {
      "name": "name",
      "dob": "dob"
    }
  ],
  "$meta": {
    "one": 1,
    "two": 2
  }
};
// Utilize the utility
removeProps(obj,['$meta']);
// Show the result
document.body.innerHTML = '<pre>' + JSON.stringify(obj,null,4) + '</pre>';
Run Code Online (Sandbox Code Playgroud)


Ren*_*ler 15

正如@floor上面评论的那样:

JSON.parse(JSON.stringify(obj, (k,v) => (k === '$meta')? undefined : v))

  • 警告此方法将从对象中删除不可序列化的内容,例如函数或 DOM 元素 (3认同)