javascript - 如何在 es6 中编写更好的代码以使用数组值格式化对象

标签 javascript arrays angularjs ecmascript-6 chart.js

我想使用 map 函数获得更好的解决方案以获得相同的预期结果。

我正在为带有条值的图表格式化 chartJs 对象。

但我使用的是 es5 语法的旧方法,我想使用 es6 语法实现相同的效果。

我尝试使用 es5 语法,例如 for..in 循环来获得所需的结果。

var graphData = [
  {org: 1234, dpt1: 1500, dpt2: 900, dpt3: 107},
  {org: 123, dpt1: 1500, dpt2: 900, dpt3: 1373},
  {org: 123, dpt1: 1500, dpt2: 900,dpt3: 946}, 
  {org: 34634634, dpt1: 1500, dpt2: 900, dpt3: 715}, 
  {org: 123123, dpt1: 1500, dpt2: 900, dpt3: 276}
 ];

实际数据将被解析为一个对象,其中包含来自所有对象的键和值

var graphdataObj = {}; 
graphData.forEach(function(elem) {
   for (var key in elem) { 
     if (graphdataObj[key]) {
        graphdataObj[key].push(elem[key]);
     } else {
        graphdataObj[key] = [];
        graphdataObj[key].push(elem[key]);
     }
  };
});

解析/结果对象==> graphdataObj

graphdataObj = {
  dpt1: [1500, 1500, 1500, 1500, 1500]
  dpt2: [900, 900, 900, 900, 900]
  dpt3: [107, 1373, 946, 715, 276] 
  org: [1234, 123, 123, 34634634, 123123]
};

我想使用 es6 语法获得相同的结果,以获得比这更好的解决方案,而无需在 forEach 中使用 for .. in 循环

最佳答案

我将使用 reduce 并遍历 graphData 的每个项目的 Object.entries,在中的键处创建一个数组值累加器,如果它尚不存在,则推送到该数组:

const graphData = [
  {org: 1234, dpt1: 1500, dpt2: 900, dpt3: 107},
  {org: 123, dpt1: 1500, dpt2: 900, dpt3: 1373},
  {org: 123, dpt1: 1500, dpt2: 900,dpt3: 946}, 
  {org: 34634634, dpt1: 1500, dpt2: 900, dpt3: 715}, 
  {org: 123123, dpt1: 1500, dpt2: 900, dpt3: 276}
];
 
const graphdataObj = graphData.reduce((a, obj) => {
  Object.entries(obj).forEach(([key, val]) => {
    if (!a[key]) a[key] = [];
    a[key].push(val);
  });
  return a;
}, {});

console.log(graphdataObj);

请注意 forEach 仍在使用,在 .reduce 中(但 forEach 最合适的数组出于副作用的目的对数组进行通用迭代的方法 - 在这一点上,没有比 forEach 更合适的方法了,所以不用担心。

关于javascript - 如何在 es6 中编写更好的代码以使用数组值格式化对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54374638/

相关文章:

javascript - 无法自动从 ng-class 添加/删除类以切换所选选项卡

javascript - 如何在javascript中打开base64编码的pdf

c# - 有没有更有效的方法来禁用多个脚本,同时在 Unity 中的单个游戏对象上保持一些事件?

javascript - "controller as"vs 隔离范围

c - 处理 C 中的结构函数 - 可以输入数组,但不能输入 int

java - 在 JAVA 中创建具有所有相同值的 List<Integer>

javascript - 使用 Angular 获取点击的类名

javascript - 为什么我的对象没有被推送到本地存储?

javascript - 缩小js时 bool 切换的原因

javascript - 当外部值发生变化时如何使组件重新渲染?