首页 > 解决方案 > JavaScript 地图归约函数

问题描述

我是 javascript 新手,使用 JSON 数据源尝试聚合数据以在网页上正确显示,并且此数据集会根据用户活动进行子集化。其中一些数据集可以达到 100 条记录,因此快速很重要。

//Here is my data
{
"metadata": {
    "mm": {
        "filter": false
    }
},
"categories": [{
        "data": [

        ],
        "name": "category_one"
    },

    {
        "data": [{
                "name": "13_WH1",
                "attributes": {
                    "bv": 145
                },
                "vm": [
                    4.0,
                    8.0,
                    6.0,
                    6.0
                ]
            },
            {
                "name": "32_WH2",
                "attributes": {
                    "bv": 155
                },
                "vm": [
                    5.0,
                    7.0,
                    7.0,
                    2.0
                ]
            }
        ],
        "name": "category_two"
    }
]
}

function sumVm(data_set) {
  data_set.map(function(series, index) {
    const total_vm = series.data.reduce(
      (accumulator, record) => accumulator + record.vm,
      0
    );
    console.log(total_vm)
    return total_vm

  })
};

当我调用该函数时,这是我的结果(只是重复每条记录,而不是按位置添加。

sumVm(jsonData)
# 04,8,6,65,7,7,2

我想要的结果是:

# 9,15,13,8

任何建议都会非常有帮助,谢谢

标签: javascript

解决方案


这是一种方法。平面映射,然后使用 foreach 构建一个新的值数组。

let jsonData = [{
  "foo": "bar",
  "data": [{
      "name": "13_WH1",
      "attributes": {
        "bv": 145,
      },
      "vm": [
        4.0,
        8.0,
        6.0,
        6.0
      ]
    },
    {
      "name": "32_WH2",
      "attributes": {
        "bv": 155,
      },
      "vm": [
        5.0,
        7.0,
        7.0,
        2.0
      ]
    }
  ]
}]

function sumVm(data_set) {
  let a = []
  let d = data_set.flatMap(e => e.data.map(d => d.vm));
  d.forEach(e => e.forEach((f, i) => {
    if (!a[i]) a[i] = 0;
    a[i] = a[i] + f
  }))
  return a
};

console.log(sumVm(jsonData))
// 9,15,13,8


推荐阅读