过滤JSON嵌套密钥并删除它们的最佳方法是什么?例如:
{ "id" : "1",
"key1" : "val1",
"key2" : "val2",
"name" : "someone",
"age" : 39,
"data" : [
{ "id" : "1234",
"key1" : "val1",
"key2" : "val2",
"name" : "someone",
"age" : 39
},
{ "id" : "1234",
"key1" : "val1",
"key2" : "val2",
"name" : "someone",
"age" : 39
}
]
}
通过递归删除所有key1
和key2
项来获取以下JSON:
{ "id" : "1",
"name" : "someone",
"age" : 39,
"data" : [
{ "id" : "1234",
"name" : "someone",
"age" : 39
},
{ "id" : "1234",
"name" : "someone",
"age" : 39
}
]
}
感谢。
答案 0 :(得分:5)
这样的事情应该有效:
function deleteRecursive(data, key) {
for(var property in data) {
if(data.hasOwnProperty(property)) {
if(property == key) {
delete data[key];
}
else {
if(typeof data[property] === "object") {
deleteRecursive(data[property], key);
}
}
}
}
}
答案 1 :(得分:1)
假设这是一个名为people
的对象的JSON,这样的东西应该有效:
function objWithoutPropsIDontLike(obj, propsIDontLike) {
// check to make sure the given parameter is an object
if(typeof obj == "object" && obj !== null) { // typeof null gives "object" ಠ_ಠ
// for every property name... (see note on Object.keys() and
// Array.forEach() below)
obj.keys().forEach(function(prop) {
// Test if the property name is one of the ones you don't like
// (Array.indexOf() returns -1 if the item isn't found in the array).
if(propsIDontLike.indexOf(prop) >= 0) {
// if it is, nuke it
delete obj[prop];
} else if(obj[prop]) {
// if it isn't, recursively filter it
obj[prop] = filterPropsIDontLike(obj[prop], propsIDontLike);
}
});
}
// There is no else { ... }; if the thing given for "obj" isn't an object
// just return it as-is.
return obj;
}
var propsIDontLike = [ 'key1', 'key2' ];
people = objWithoutPropsIDontLike(people, propsIDontLike);
Object.keys()
和Array.forEach()
在Internet Explorer中不可用< 9.幸运的是,MDC为Object.keys(),Array.forEach()提供了工作填充物。
答案 2 :(得分:0)
你的问题包含你的答案:递归!
您的基本案例是“原始”JSON类型:字符串和数字。这些保持不变。对于数组,将操作应用于数组的每个元素,返回一个新数组。
有趣的案例是对象。在这里,对于每个键值对,您将操作应用于每个值(但忽略那些键是您想要“删除”的键)并将它们写入新对象。
作为(关闭袖口)示例,使用jQuery:
var removeKey(object, key){
if(typeof(object)==='number' || typeof(object)==='string'){
return object;
}
else if(typeof(object)==='object'){
var newObject = {};
$.each(object, function(k, value) {
if(k!==key){
newObject[k] = removeKey(value, key);
}
});
return newObject;
}
else {
// Oh dear, that wasn't really JSON!
}
};
如果要删除多个键,请根据需要调整递归情况下的第二个参数和条件。
注意这是一种非破坏性的,可能是您需要的,也可能不是您需要的;另一个答案(由Vivin Paliath提供)具有破坏性版本。