【问题标题】:Iterate through a groupby array of json遍历 json 的 groupby 数组
【发布时间】:2019-09-15 11:53:24
【问题描述】:

我有一个 JSON 对象数组,如下所示

 var array = [{"id":"1","value": "13"},{"id":"2","value": "23"},{"id":"1","value": "33"},{"id":"3","value": "13"}]

然后我按照id对json数组进行分组如下

var groupArray = {"1":[{"id":"1","value": "13"},{"id":"1","value": "33"}],
                     "2": [{"id":"2","value": "23"}],
                     "3": [{"id":"3","value": "13"}]};

我想遍历 groupArray 并获得每个 id 的总价值,其中重复的 id 应该加在一起并给出一个总价值并将它们分配到另一个数组中,如下所示

resultArray
[{"id":"1","value":"46"},{"id":"2","value":"23"},{"id":"3","value":"13"}]

这应该使用angularjs来实现

【问题讨论】:

  • 你的问题是什么?
  • 我想遍历分组数组并得到resultArray,如上图。我不知道如何遍历 json 的分组数组
  • 顾名思义是groupArray和数组还是{ }建议的对象?
  • 我认为这是一个哈希,所以我们必须做一个 for 循环并索引我认为的哈希值才能到达数组
  • groupArray 是一个对象

标签: javascript arrays json angularjs grouping


【解决方案1】:

您可以使用函数reduce 进行分组,使用函数Object.values 提取所需的输出。

var array = [{"id":"1","value": "13"},{"id":"2","value": "23"},{"id":"1","value": "33"},{"id":"3","value": "13"}]
let result = Object.values(array.reduce((a, {id, value}) => {
  (a[id] || (a[id] = {id, value: 0})).value += +value;
  return a;
}, Object.create(null)));

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

【讨论】:

    【解决方案2】:

    使用Object.entries 将对象键和值作为一个数组获取,然后遍历这些值以总结每个对象内的value,然后将其与其id 推送到resultArray

    let groupArray = {"1":[{"id":"1","value": "13"},{"id":"1","value": "33"}],"2": [{"id":"2","value": "23"}],"3": [{"id":"3","value": "13"}]}
    let resultArray = []
    Object.entries(groupArray).forEach(g => {
      let sumValue = 0
      g[1].forEach(o => sumValue += parseFloat(o.value))
      resultArray.push({
        "id": g[0],
        "value": sumValue.toString()
      })
    })
    console.log(resultArray)

    【讨论】:

    • 既然他要求 AngularJS,应该提到 ES2015 和 ES2017 支持
    【解决方案3】:

    如果groupArray 实际上是一个数组会更容易。作为一个对象,您必须知道顺序并不总是得到保证,但尚不清楚最终数组的顺序是否重要。在最近的 JS 中,这无关紧要——数字键将被排序。您可以在Object.values() 上调用map(),然后在每个数组上使用reduce()

    var groupArray = {
        "1":[{"id":"1","value": "13"},{"id":"1","value": "33"}],
        "2": [{"id":"2","value": "23"}],
        "3": [{"id":"3","value": "13"}]
    }
    
    let sums = Object.values(groupArray)
               .map(arr => arr.reduce((sums,{id, value}) => ({id, value: sums.value + +value}), {value:0}))
    console.log(sums)

    您需要注意value 是一个字符串,并确保在使用+ 时添加的是数字而不是连接字符串。

    【讨论】:

      【解决方案4】:

      这会起作用

      const object = {}
      const array = [{"id":"1","value": "13"},{"id":"2","value": "23"},{"id":"1","value": "33"},{"id":"3","value": "13"}]
      
      array.forEach(data => {
        object[data.id] = parseInt(data.value, 10) + (object[data.id] || 0)
      })
      
      const result = Object.entries(object).map(data => {
        return {
          'id': data[0],
          'value': data[1]
        }
      })
      
      console.log(result)
      

      【讨论】:

        猜你喜欢
        • 2011-02-05
        • 1970-01-01
        • 2016-12-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-08
        • 2013-02-12
        相关资源
        最近更新 更多