'Reduce javascript map change key dynamically

I would like to have the array in output using the input array in the reduce function. But I can't manage to dynamically add a key like this "${keyOrigin}": cur.value })

Thanks for your help ! <3

const input = [{
    date: '10/03/40922',
    origin: 'Angleterre',
    value: 39
  },
  {
    date: '10/03/40922',
    origin: 'Espagne',
    value: 60
  },
  {
    date: '10/03/40922',
    origin: 'Argentine',
    value: 54
  },
  {
    date: '10/03/40922',
    origin: 'Italie',
    value: 45
  },
  {
    date: '10/03/40922',
    origin: 'Hollande',
    value: 40
  },
  {
    date: '10/03/40922',
    origin: 'Russie',
    value: 110
  },
  {
    date: '10/03/40922',
    origin: 'Suisse',
    value: 87
  },
  {
    date: '10/03/40922',
    origin: 'France',
    value: 143
  },
  {
    date: '11/03/40922',
    origin: 'Angleterre',
    value: 39
  },
  {
    date: '11/03/40922',
    origin: 'Espagne',
    value: 60
  },
  {
    date: '11/03/40922',
    origin: 'Argentine',
    value: 54
  },
  {
    date: '11/03/40922',
    origin: 'Italie',
    value: 45
  },
  {
    date: '11/03/40922',
    origin: 'Hollande',
    value: 40
  },
  {
    date: '11/03/40922',
    origin: 'Russie',
    value: 110
  },
  {
    date: '11/03/40922',
    origin: 'Suisse',
    value: 87
  },
  {
    date: '11/03/40922',
    origin: 'France',
    value: 143
  }
];

const output = [{
    date: "10/03/40922",
    Angleterre: 39,
    Espagne: 60,
    Argentine: 54,
    Italie: 45,
    Hollande: 40,
    Russie: 110,
    Suisse: 97,
    France: 143
  },
  {
    date: "11/03/40922",
    Angleterre: 39,
    Espagne: 60,
    Argentine: 54,
    Italie: 45,
    Hollande: 40,
    Russie: 110,
    Suisse: 97,
    France: 143
  },
];

const reduceByDate = (array) => {
  const result = Array.from(
    array
    .reduce((acc, cur) => {
      const key = JSON.stringify(cur.date);
      const current = acc.get(key) || {
        date: cur.date
      };
      const keyOrigin = JSON.stringify(cur.origin);

      return acc.set(key, { ...current,
        "`${keyOrigin}`": cur.value
      });
    }, new Map())
    .values()
  );
  return result;
};

console.log(reduceByDate(input))


Solution 1:[1]

You meant to do use a computed property name

{ ...current, [cur.origin]: cur.value })

no need to stringify either - simplified - I am sure I could even get rid of the Map if I spent a little more time:

const reduceByDate = array => [...array
    .reduce((acc, cur) => {
      const date = cur.date;
      const current = acc.get(date) || { date };
      return acc.set(date, { ...current, [cur.origin]: cur.value });
    }, new Map())
  .values()];

const reduceByDate = array => [...array
    .reduce((acc, cur) => {
      const date = cur.date;
      const current = acc.get(date) || { date };
      return acc.set(date, { ...current, [cur.origin]: cur.value });
    }, new Map())
  .values()];

console.log(reduceByDate(input))
<script>
const input = [
  { date: '10/03/40922', origin: 'Angleterre', value: 39 },
  { date: '10/03/40922', origin: 'Espagne', value: 60 },
  { date: '10/03/40922', origin: 'Argentine', value: 54 },
  { date: '10/03/40922', origin: 'Italie', value: 45 },
  { date: '10/03/40922', origin: 'Hollande', value: 40 },
  { date: '10/03/40922', origin: 'Russie', value: 110 },
  { date: '10/03/40922', origin: 'Suisse', value: 87 },
  { date: '10/03/40922', origin: 'France', value: 143 },
  { date: '11/03/40922', origin: 'Angleterre', value: 39 },
  { date: '11/03/40922', origin: 'Espagne', value: 60 },
  { date: '11/03/40922', origin: 'Argentine', value: 54 },
  { date: '11/03/40922', origin: 'Italie', value: 45 },
  { date: '11/03/40922', origin: 'Hollande', value: 40 },
  { date: '11/03/40922', origin: 'Russie', value: 110 },
  { date: '11/03/40922', origin: 'Suisse', value: 87 },
  { date: '11/03/40922', origin: 'France', value: 143 }
];</script>

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1