Я пытаюсь отфильтровать массив и уменьшить значения, но не знаю, как это сделать.
Итак, у меня есть пример массива [["Hampton Tricep Rope", 3],["Chrome Curl" Bar,8],["Hampton Tricep Rope", 6]]
Как создать функцию с возвратом [["Hampton Tricep Rope", 9],["Chrome Curl" Bar,8]]
?
Есть ли у вас какие-либо идеи?
Вы можете использовать Array.prototype.reduce()
для возврата объекта, который содержит каждое уникальное имя и его значение.
Наконец, используйте Object.entries()
, чтобы получить массив с key
и value
из этого объекта.
const arr = [["Hampton Tricep Rope", 3],["Chrome Curl Bar", 8],["Hampton Tricep Rope", 6]];
const res = Object.entries(arr.reduce((acc, [name, value]) => {
if (!acc[name]) {
acc[name] = value;
} else {
acc[name] += value;
}
return acc;
}, {}))
console.info(res);
Вы можете использовать сокращение и findIndex
const list = [
["Hampton Tricep Rope", 3],
["Chrome Curl Bar", 8],
["Hampton Tricep Rope", 6]
].reduce((acc, x) => {
const index = acc.findIndex(y => y[0] === x[0]);
if (index >= 0) {
acc[index][1] += x[1];
return acc;
}
acc.push(x);
return acc;
}, [])
console.info(list)
var result = [];
[["Hampton Tricep Rope", 3],["Chrome Curl Bar",8],["Hampton Tricep Rope", 6]].reduce(function(res, value) {
if (!result.filter((item) => (item[0] === value[0])).length) {
result.push([value[0], value[1]]);
} else {
result.filter((item) => (item[0] === value[0]))[0][1] += value[1];
}
return res;
}, {});
Нам нужен массив для построения, пока мы уменьшаем другой, как вы можете видеть выше. На каждом шаге мы проверяем, есть ли у нас уже этот элемент. Если нет, то добавляем. В противном случае мы увеличиваем его в соответствии с нашими потребностями.