我有一个 JSON 对象,如下所示:
x = {
"prop1": {
"description": "prop1",
"dataType": "string",
"value" : "abc"
},
"prop2": {
"sub1": {
"description": "sub1",
"dataType": "integer",
"value" : 12
},
"sub2": {
"description": "sub2",
"dataType": "integer"
}
},
"prop3": {
"input": {
"name": {
"description": "input messages",
"dataType": "boolean",
"value": false
}
},
"output": {
"description": "output messages",
"dataType": "boolean",
"value": false
}
}
}
在上面的对象中,我想删除键(描述,数据类型),如果键没有任何值键,也删除键。上述的预期输出如下。
y = {
"prop1": {
"value" : "abc"
},
"prop2": {
"sub1": {
"value" : 12
}
},
"prop3": {
"input": {
"name": {
"value": false
}
},
"output": {
"value": false
}
}
}
我目前的解决方案如下:
function findValue(obj, string, obj1) {
if (obj.hasOwnProperty("value")) {
obj1[string.substring(1)] = obj.value
return
}
for (var key in obj) {
findValue(obj[key], [string, key].join("."), obj1)
}
}
console.log(x);
var x1 = {}
findValue(x, "", x1)
var y = {};
function assign(obj, keyPath, value) {
const lastKeyIndex = keyPath.length - 1;
for (var i = 0; i < lastKeyIndex; ++i) {
const key = keyPath[i];
if (!(key in obj)) {
obj[key] = {}
}
obj = obj[key];
}
obj[keyPath[lastKeyIndex]] = { "value": value };
}
Object.keys(x1).forEach(key => {
const keyPath = key.split('.');
let value = x1[key];
if (value != null) {
this.assign(y, keyPath, value);
}
});
console.log(y);
我做了很长时间。我首先将我的对象转换为一种格式,其中每个键都是父键和子键的组合,然后将其转换为预期的格式。
有没有办法让它更好?
我会编写一个通用的项目处理函数。如果该项目是一个对象,则遍历其值并递归调用该函数,如果有任何与键匹配的嵌套值,则返回一个新对象。如果没有与键匹配的嵌套值,则返回一个唯一值(可以是 Symbol),指示调用者应该从父对象中删除该值:
const removeThis = Symbol();
const transform = item => {
if (typeof item !== 'object' || item === null) {
return item;
}
const newEntries = [];
for (const [key, val] of Object.entries(item)) {
if (key === keyToKeep) newEntries.push([key, val]);
else if (typeof val === 'object' && val !== null) {
const possibleNewObj = transform(val);
if (possibleNewObj !== removeThis) {
newEntries.push([key, possibleNewObj]);
}
}
}
return newEntries.length
? Object.fromEntries(newEntries)
: removeThis;
};
const obj = {
"prop1": {
"description": "prop1",
"dataType": "string",
"value" : "abc"
},
"prop2": {
"sub1": {
"description": "sub1",
"dataType": "integer",
"value" : 12
},
"sub2": {
"description": "sub2",
"dataType": "integer"
}
},
"prop3": {
"input": {
"name": {
"description": "input messages",
"dataType": "boolean",
"value": false
}
},
"output": {
"description": "output messages",
"dataType": "boolean",
"value": false
}
}
};
const keyToKeep = 'value';
console.log(transform(obj));
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句