Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/469.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用JavaScript what';从对象中递归删除属性和值的最快方法是什么?_Javascript_Object_Recursion_Javascript Objects - Fatal编程技术网

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

使用JavaScript what';从对象中递归删除属性和值的最快方法是什么?,javascript,object,recursion,javascript-objects,Javascript,Object,Recursion,Javascript Objects,我需要找到从对象中删除所有$meta属性及其值的最快方法,例如: { "part_one": { "name": "My Name", "something": "123", "$meta": { "test": "test123" } }, "part_two": [ { "name": "name", "dob": "dob", "$meta": { "something":

我需要找到从对象中删除所有
$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
  }
}
如果
$meta
属性可以位于对象中的任何一点,那么可能需要某种形式的递归,那么应该变成以下内容

{
  "part_one": {
    "name": "My Name",
    "something": "123"
  },
  "part_two": [
    {
      "name": "name",
      "dob": "dob"
    },
    {
      "name": "name",
      "dob": "dob"
    }
  ]
}
任何帮助或建议都将不胜感激

谢谢大家!

//Helper函数
功能移除道具(obj,按键){
if(阵列的obj实例){
目标forEach(功能(项目){
移除道具(物品、钥匙)
});
}
else if(对象的类型=='object'){
Object.getOwnPropertyNames(obj).forEach(函数(键){
如果(key.indexOf(key)!=-1)删除对象[key];
否则移除道具(obj[键],键);
});
}
}
//我们要迭代的对象
var obj={
“第一部分”:{
“姓名”:“我的姓名”,
“某物”:“123”,
“$meta”:{
“测试”:“test123”
}
},
“第二部分”:[
{
“名称”:“名称”,
“dob”:“dob”,
“$meta”:{
“某物”:“其他”,
“和”:“更多”
}
},
{
“名称”:“名称”,
“dob”:“dob”
}
],
“$meta”:{
"一":一,,
“两个”:2
}
};
//利用效用
移除props(obj,['$meta']);
//显示结果

document.body.innerHTML=''+JSON.stringify(obj,null,4)+''一个简单的自调用函数可以做到这一点

function removeMeta(obj) {
  for(prop in obj) {
    if (prop === '$meta')
      delete obj[prop];
    else if (typeof obj[prop] === 'object')
      removeMeta(obj[prop]);
  }
}
// removes all propsToRemove (passed as an array or string), drilling down up to maxLevel times
// will modify the input and return it
du.removeAllPropsFromObj = function(obj, propsToRemove, maxLevel) {
    if (typeof maxLevel !== "number") maxLevel = 10
    for (var prop in obj) {
        if (typeof propsToRemove === "string" && prop === propsToRemove)
            delete obj[prop];
        else if (propsToRemove.indexOf(prop) >= 0)      // it must be an array
            delete obj[prop];
        else if (typeof obj[prop] === "object" && maxLevel>0)
            du.removeAllPropsFromObj(obj[prop], propsToRemove, maxLevel-1);
    }
    return obj
}
var myObj={
“第一部分”:{
“姓名”:“我的姓名”,
“某物”:“123”,
“$meta”:{
“测试”:“test123”
}
},
“第二部分”:[
{
“名称”:“名称”,
“dob”:“dob”,
“$meta”:{
“某物”:“其他”,
“和”:“更多”
}
},
{
“名称”:“名称”,
“dob”:“dob”
}
],
“$meta”:{
"一":一,,
“两个”:2
}
}
函数removeMeta(obj){
用于(obj中的道具){
如果(prop=='$meta')
删除obj[prop];
else if(对象的类型[prop]=“对象”)
removeMeta(obj[prop]);
}
}
removeMeta(myObj);

console.log(myObj)如上@floor所述:

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

(抱歉,我还没有足够的信誉点直接发表评论。)

仅供参考,typeof null==='object',因此在@joseph marikle提供的removeMeta()示例中,函数将在null值上递归


请阅读此处的更多内容:

这里有一个函数,可以递归删除字符串或字符串数组(基于Joseph的回答):


当对象中的任何键处于任何级别时,我使用@Joseph Marikle的引用函数创建了此函数

 const _obj = {
       a: "b", b: "e", c: { a: "a", b: "b", c: "c"},
       d: [ { a: "3" }, { b: ["2", "3"] }]};
 console.log(removeAttrDeep(_obj, "b"));
例如:

// recursively delete a key from anywhere in the object
// will mutate the obj - no need to return it
const deletePropFromObj = (obj, deleteThisKey) => {
  if (Array.isArray(obj)) {
    obj.forEach(element => deletePropFromObj(element, deleteThisKey))
  } else if (typeof obj === 'object') {
    for (const key in obj) {
      const value = obj[key]
      if (key === deleteThisKey) delete obj[key]
      else deletePropFromObj(value, deleteThisKey)
    }
  }
}

deletePropFromObj(obj, '$meta');

不要使用递归,而是复制对象,忽略不需要的属性和值。关于javascript中递归的一个一般注意事项:它取决于浏览器内存分配,内存分配不太重要,因此递归占用大量资源,除非实现仔细的内存管理,否则无法用于大型数据集。最快的方法是先自己实现,然后寻求有关加快速度的帮助。您可以使用for in循环或更确切地说for of-->遍历对象属性和值,直到JS进行尾部递归优化。这对大型对象不安全。对于具有循环引用的对象来说,这也是不安全的。它工作得很好,如果需要保留原始对象,请确保克隆该对象。我看它对我不起作用。如果这是一个对象,则只取第一个属性。其他的呢?它不会返回整个对象并删除特定的道具。或者我遗漏了什么?相反,提供替换项作为stringify调用的参数,从而避免将这些属性序列化为string,首先警告此方法将从对象中删除不可序列化的内容,如函数或DOM元素,例如,在任何级别的纯js中实现这一点的智能方法,谢谢!
// recursively delete a key from anywhere in the object
// will mutate the obj - no need to return it
const deletePropFromObj = (obj, deleteThisKey) => {
  if (Array.isArray(obj)) {
    obj.forEach(element => deletePropFromObj(element, deleteThisKey))
  } else if (typeof obj === 'object') {
    for (const key in obj) {
      const value = obj[key]
      if (key === deleteThisKey) delete obj[key]
      else deletePropFromObj(value, deleteThisKey)
    }
  }
}

deletePropFromObj(obj, '$meta');