Вычислите сумму в массиве с условием

#javascript #arrays

Вопрос:

У меня есть массив, подобный этому

 var input = [
  {
    type: "A",
    low: 1,
    mid: 2,
    high: 3,
  },
  {
    type: "B",
    low: 3,
    mid: 2,
    high: 0,
  },
];
 

Я хочу выполнить функцию, которая поможет мне собрать все элементы в этом массиве в новый массив, содержащий только 2 элемента соответствующего типа, и их общее количество будет низким, средним и высоким, я попробовал функцию ниже, и она работает, но это выглядит довольно глупо.

 let resultArr = [
    {
        category: "A",
        low: 0,
        mid: 0,
        high: 0
    },
    {
        category: "B",
        low: 0,
        mid: 0,
        high: 0
    }
]
input.forEach(element => {
    if (element.type == "A") {
        resultArr[0].low  = element.low
        resultArr[0].mid  = element.high
        resultArr[0].high  = element.high
    }
    else {
        resultArr[1].low  = element.low
        resultArr[1].mid  = element.high
        resultArr[1].high  = element.high
    }
});

console.log(resultArr)
 

У нас есть другой способ сделать это более «профессиональным», спасибо.

Комментарии:

1. Вы хотите сказать, что может быть несколько элементов категорий A и B, и что результирующий массив должен содержать только один из них с суммой низких, средних и высоких значений для всех элементов каждой категории? Это, по сути, группа по операциям.

2. Может быть, вы ищете reduce groupBy функцию или. Кстати, это понятно, и это работает, чувак, зачем утруждать себя и усложнять его обслуживание.

3. что именно вы подразумеваете под низким, средним, высоким будет их общее количество ?

4. @RobG да, именно это я и пытаюсь сказать.

5. @HR01M8055 Я имею в виду, что это будет сумма низкого и среднего максимума. похоже, проблема была решена, благодаря Робби

Ответ №1:

Вы можете reduce() перейти к промежуточному объекту, а затем получить его Object.values() :

 const data = [{
  type: 'A',
  low: 1,
  mid: 2,
  high: 3,
}, {
  type: 'B',
  low: 3,
  mid: 2,
  high: 0,
}];

const result = Object.values(data.reduce((a, {type, low, mid, high}) => {
  a[type] = a[type] || {category: type, low: 0, mid: 0, high: 0};
  a[type].low  = low;
  a[type].mid  = mid;
  a[type].high  = high;
  return a;
}, {}));

console.log(result); 

Ответ №2:

var newInput = input.map(ele=> ({ type: ele.type, sum: ele.low ele.mid ele.high }));

Это решит проблему

Комментарии:

1. Пожалуйста, учтите, что в этом массиве больше элементов.