假设我有嵌套对象,例如:
var obj = {
"items":[
{
"name":"Item 1",
"value": "500",
"options": [{...},{...}]
},
{
"name":"Item 2",
"value": "300",
"options": [{...},{...}]
}
],
"name": "Category",
"options": [{...},{...}]
};
我想从所有对象的任何级别删除options属性。对象也可以嵌套在对象和数组中。
我们目前正在项目中使用Lodash,但我对任何解决方案都很好奇。
答案 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;
}