【问题标题】:How to iterate through a JSON Object with nested properties, manipulate and return a new object?如何遍历具有嵌套属性的 JSON 对象,操作并返回一个新对象?
【发布时间】:2017-11-17 07:32:57
【问题描述】:

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

谁能帮帮我。

谢谢。

【问题讨论】:

  • 会不会像你的例子那样最多是双重嵌套?
  • I have a JSON object - 不,你有一个 javascript 对象,你根本没有 JSON

标签: javascript json


【解决方案1】:

我会使用递归调用:

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

【讨论】:

  • 我想obj[k] += 0.067 从技术上讲是作者所要求的(“找到具有数值的属性并将其替换为计算值,并返回一个新对象”),但这就是他们真正的意思想要吗?
  • @vox 我添加了 cmets 以使程序更有意义。谢谢!
  • 太棒了。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-20
  • 2015-01-07
  • 1970-01-01
  • 2018-05-13
  • 1970-01-01
相关资源
最近更新 更多