Как объединить массив javascript с общими свойствами в один? - PullRequest
0 голосов
/ 25 марта 2020

У меня есть массив объектов со следующей структурой

[
  [
    {
      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']
  }
]

В основном Я хотел бы объединить каждую запись с одним и тем же именем упражнения, чтобы создать массив с весами и рабочими нагрузками. Как я мог достичь чего-то подобного?

Ответы [ 2 ]

1 голос
/ 25 марта 2020

Используйте 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));
0 голосов
/ 25 марта 2020

Вы можете объединить ваш 2d массив в один массив, а затем использовать reduce для управления процессом накопления.

Пример:

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 merged = [ ...data[0], ...data[1] ];
// or
const merged = data.reduce( (acc, curr) => ([...curr, ...acc]), []);
const results = merged.reduce( (acc, curr) => {
  const match = acc.find(a => a.exercise === curr.exercise);
  if (!match) {
    acc.push({
      exercise: curr.exercise,
      weight: [curr.weight],
      workload: [curr.workload],
      date: [curr.date]
    });
  } else {
    match.weight.push(curr.weight);
    match.workload.push(curr.workload);
    match.date.push(curr.date);
  }
  return acc;
}, []);
console.log(results);
...