【问题标题】:Object manipulation对象操作
【发布时间】:2018-09-17 16:14:08
【问题描述】:

我正在使用 PHP 或 Javascript 来操作 API 示例中的 json 对象:

{
"data": [
    {
        "label": "employeeCount",
        "stats": [
            {
                "year": "2015",
                "value": "10"
            },
            {
                "year": "2017",
                "value": "30"
            },
            {
                "year": "2016",
                "value": "50"
            }
        ]
    },
    {
        "label": "managerCount",
        "stats": [
            {
                "year": "2015",
                "value": "2"
            },
            {
                "year": "2017",
                "value": "4"
            },
            {
                "year": "2016",
                "value": "6"
            }
        ]
    }
  ]
}

我需要将它按年份分类为这样的对象:

"record": {
  "2015" : {
    "employeeCount": "10",
    "managerCount": "2"
  },
  "2016" : {
    "employeeCount": "30",
    "managerCount": "4"
  },
  "2017"{
    "employeeCount": "50",
    "managerCount": "6"
  }
}

year 的数量和label 的数量将与 API 调用不同,所以我正在考虑使用 for 循环来实现它。但到目前为止还没有成功。对于这种操作,您会使用什么方法?

【问题讨论】:

  • 如何反序列化 json 对象,对其进行操作并再次转换为 json 字符串。
  • “但到目前为止没有成功”你尝试了什么?

标签: javascript php arrays object data-manipulation


【解决方案1】:

使用Array.forEach

逻辑 - 想法是遍历对象中的data array,然后对于数据数组中的每个条目,遍历其对应的stats array 以根据year 填充对象。在迭代 stat array 时,检查结果对象中的现有条目。如果不存在,请为其创建一个条目。通过将label 添加为keyvalue 从其在stat array 中的对应对象中更新条目。

let obj = {"data":[{"label":"employeeCount","stats":[{"year":"2015","value":"10"},{"year":"2017","value":"30"},{"year":"2016","value":"50"}]},{"label":"managerCount","stats":[{"year":"2015","value":"2"},{"year":"2017","value":"4"},{"year":"2016","value":"6"}]}]};

// Create the response object
let r = {"record":{}};
// Iterate over data array
obj.data.forEach(o => {
  // Iterate over stats for each object in data array
  o.stats.forEach(s => {
    // Create entry for year in result object if it does not exist
    r.record[s.year] = r.record[s.year] || {};
    // Add the label of data array object with corresponding stat value in resultant object
    r.record[s.year][o.label] = s.value;
  });
});
console.log(r);

【讨论】:

  • 虽然此代码可能会回答问题,但提供有关此代码为何和/或如何回答问题的额外上下文可提高其长期价值。 好的答案将始终解释所做的事情以及为什么以这种方式完成,不仅是为了 OP,也是为了 SO 的未来访问者。跨度>
  • @JayBlanchard - 得分。更新答案
【解决方案2】:
let data = json.data
let map={}
for(let i=0;i<data.length;i++){
    let stats = data[i].stats
    for(let j=0;j<stats.length;j++){
        let it = stats[j]
        if(!map[it.year]){
            map[it.year]={}
        }
        map[it.year][data[i].label]=it.value
    }
}
console.log({record:map})

【讨论】:

  • 虽然此代码可能会回答问题,但提供有关此代码为何和/或如何回答问题的额外上下文可提高其长期价值。 好的答案将始终解释所做的事情以及为什么以这种方式完成,不仅是为了 OP,也是为了 SO 的未来访问者。跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-25
  • 1970-01-01
  • 2014-03-25
  • 2018-06-17
  • 2013-09-21
  • 2021-11-27
相关资源
最近更新 更多