首页 > 解决方案 > 如何将具有公共属性的javascript数组合并为一个数组?

问题描述

我有一组具有以下结构的对象

[
  [
    {
      exercise: 'Incline Dumbbell Curl',
      weight: 25,
      workload: 600,
      date: '03/23'
    },
    {
      exercise: 'Skullcrushers',
      weight: 25,
      workload: 600,
      date: '03/23'
    }
  ],
  [
    {
      exercise: 'Incline Dumbbell Curl',
      weight: 27.333333333333332,
      workload: 656,
      date: '03/25'
    },
    {
      exercise: 'Skullcrushers',
      weight: 31.333333333333332,
      workload: 752,
      date: '03/25'
    }
  ]
]

我想根据上面的例子创建一个如下所示的数组

[
  {
    exercise: 'Incline Dumbbell Curl',
    weights: [25, 27.33],
    workloads: [600, 656],
    dates: ['03/23', '03/25']
  },
  {
    exercise: 'Skullcrushers',
    weights: [25, 31.33],
    workloads: [600, 752],
    dates: ['03/23', '03/25']
  }
]

基本上,我想将每个具有相同练习名称的条目组合起来,以创建一个包含权重和工作负载的数组。我怎么能实现这样的目标?

标签: javascriptarraysnode.jsjsonjavascript-objects

解决方案


用于forEach从数组构建对象。

const data = [
  [
    {
      exercise: "Incline Dumbbell Curl",
      weight: 25,
      workload: 600,
      date: "03/23"
    },
    {
      exercise: "Skullcrushers",
      weight: 25,
      workload: 600,
      date: "03/23"
    }
  ],
  [
    {
      exercise: "Incline Dumbbell Curl",
      weight: 27.333333333333332,
      workload: 656,
      date: "03/25"
    },
    {
      exercise: "Skullcrushers",
      weight: 31.333333333333332,
      workload: 752,
      date: "03/25"
    }
  ]
];

const update = data => {
  const arr = data.flat();
  const res = {};
  arr.forEach(item => {
    const newItem = res[item.exercise] || {
      exercise: item.exercise,
      weight: [],
      workload: [],
      date: []
    };

    ["weight", "workload", "date"].forEach(key => {
      newItem[key].push(item[key]);
    });
    res[item.exercise] = newItem;
  });
  return Object.values(res);
};

console.log(update(data));


推荐阅读