如何使用嵌套属性迭代JSON对象,操作并返回一个新对象?

时间:2017-11-16 23:10:10

标签: javascript json

我有一个带有嵌套属性的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);

有人可以帮我解决这个问题。

谢谢。

1 个答案:

答案 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