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

时间:2016-01-05 09:00:59

标签: javascript object lodash

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

var obj = {
    "items":[
        {
            "name":"Item 1", 
            "value": "500",
            "options": [{...},{...}]
        },
        {
            "name":"Item 2", 
            "value": "300",
            "options": [{...},{...}]
        }
    ],
    "name": "Category",
    "options": [{...},{...}]
};

我想从所有对象的任何级别删除options属性。对象也可以嵌套在对象和数组中。

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

6 个答案:

答案 0 :(得分:5)

没有直接的方法来实现这一点,但是您可以使用以下函数从JSON中删除密钥。

def clean_book_intro_component(component)
  sanitize @book.intro.send(component), tags: %w(span b i p a), attributes: %w(id class style href)
end

并像

一样使用它
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;
}

答案 1 :(得分:1)

修改上述解决方案,要删除在我的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") {
         let objectToCheck = obj[property];
         delete obj.property
         let newJsonData= this.removeProp(obj[property], propToDelete);
         obj[property]= newJsonData
      } else {
          if (property === propToDelete) {
            delete obj[property];
          }
        }
    }
    return obj
}

答案 2 :(得分:1)

我们现在将object-scan用于此类数据处理任务。一旦将头缠绕在它上,它就会非常强大。这是您回答问题的方式

const objectScan = require('object-scan');

const prune = (input) => objectScan(['**.options'], {
  rtn: 'count',
  filterFn: ({ parent, property }) => {
    delete parent[property];
  }
})(input);

const obj = {
  items: [{
    name: 'Item 1',
    value: '500',
    options: [{}, {}]
  }, {
    name: 'Item 2',
    value: '300',
    options: [{}, {}]
  }],
  name: 'Category',
  options: [{}, {}]
};

console.log(prune(obj));
// => 3

console.log(JSON.stringify(obj));
// => {"items":[{"name":"Item 1","value":"500"},{"name":"Item 2","value":"300"}],"name":"Category"}

答案 3 :(得分:0)

对空答案的一些修改,可以删除也是对象的属性

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;
}

答案 4 :(得分:0)

我遇到了类似的问题,并且得到解决。我希望我的解决方案可能对某人有所帮助。

我使用Es6 ...传播算子对对象进行浅表复制,并对我不感兴趣的属性设置为空。

const newObject = {
   ...obj.items,
   ...obj.name,
   options: null // option property will be null.
}

答案 5 :(得分:0)

$('.counter').on('keyup',function(){
var str=$('textarea').val();
var count = (str.match(/=/g) || []).length;
$(this).find('span').html(count);
});

与lodash一样,这很容易,您也可以通过这样的参数指定键

function omit(source) {
  return isArray(source)
    ? source.map(omit)
    : isObject(source)
    ? (({ options, ...rst }) => mapValues(rst, omit))(source)
    : source;
}