我有一个带有嵌套属性的JSON对象,如下所示:
var obj = {
"a0": {
"count": 41,
"name": "Park",
"new": {
"id": 35,
"registerid": 46
}
},
"a1": {
"count": 52,
"name": "Greg",
"old": {
"id": 38,
"registerid": 49
}
},
"a2": {
"count": 150,
"name": "Sylvain",
}
}
我想迭代整个对象,找到具有数值的属性,并用计算值替换它们,并返回一个新对象。
因此,如果我传入上面的JSON对象,我想将其返回为:
result = {
"a0": {
"count": 411.067,
"name": "Park",
"new": {
"id": 351.067,
"registerid": 461.067
}
},
"a1": {
"count": 521.067,
"name": "Greg",
"old": {
"id": 381.067,
"registerid": 491.067
}
},
"a2": {
"count": 150.067,
"name": "Sylvain"
}
}
我之前问过一个类似的问题here并且有一个很棒的答案,但它不处理嵌套的情况,它不会返回整个对象与替换,但会返回一个过滤的对象与数值对象属性。
我尝试在Object.keys()上使用forEach并在其中调用地图,但似乎我在回调函数中丢失了变量范围。
let result = Object.keys(obj).forEach(function(key, index) {
Object.keys(obj).map((key) => {
let o = obj[key];
console.log("Object is:", o);
return Object.keys(o).reduce((r, k) => typeof o[k] === 'number' ? Object.assign(r, { [k]:precise(o[k], 5) }) : r , {});
});
});
console.log(result);
有人可以帮我解决这个问题。
谢谢。
答案 0 :(得分:3)
我会使用递归调用:
function process(obj) {
let result = {};
Object.keys(obj).forEach(k => {
if(typeof obj[k] === 'number') {
result[k] = obj[k] += 0.067; // calculate you numeric properties here!
}
else if(typeof obj[k] === 'object') {
result[k] = process(obj[k]); // a recursive call for nested objects
}
else {
result[k] = obj[k]; // just pass an orginal value
}
}
);
return result;
}
let result = process(obj); // here the obj is the initial data object
我还创建了Plunker demo。