#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. Пожалуйста, учтите, что в этом массиве больше элементов.