Как объединить массив объектов в один массив в js
Есть переменная res, которая помещает в себя массив объектов, значение id которых равно значению resultFinal (при работе это значение меняется: каждый раз получаем новый массив объектов, а точнее массив из одного объекта):
const res = cards.filter((val) => val.id === resultFinal);
При первом срабатывании, к примеру, выходит такой результат:
[{id: 1, title: 'яблоко', price: 61, photo: 'img/cards/card3.jpg'}]
При втором:
[{id: 4, title: 'вишня', price: 169, photo: 'img/cards/card4.jpg'}]
и т.д. Как мне объединить эти массивы в один и получить суммарную стоимость?
Изначально работаем с массивом объектов:
const cards = [
{
id: 1, title: 'яблоко', price: 61, photo: 'img/cards/card1.jpg'},
id: 2, title: 'банан', price: 69, photo: 'img/cards/card2.jpg'},
id: 3, title: 'киви', price: 119, photo: 'img/cards/card3.jpg'},
id: 4, title: 'вишня', price: 169, photo: 'img/cards/card4.jpg'
},....
]
Ответы (2 шт):
const cards = [{
id: 1,
title: 'яблоко',
price: 61,
photo: 'img/cards/card1.jpg'
},
{
id: 2,
title: 'банан',
price: 69,
photo: 'img/cards/card2.jpg'
},
{
id: 3,
title: 'киви',
price: 119,
photo: 'img/cards/card3.jpg'
},
{
id: 4,
title: 'вишня',
price: 169,
photo: 'img/cards/card4.jpg'
}
]
let arrResults = [];
let prices = [];
//ищем объект с заданым id
function searhById(placeForSearh, id) {
return placeForSearh.filter((val) => val.id === id);
}
//добавляем результат поиска в отдельный массив
function addSearhToArr(arr, searchResult) {
return arr.concat(searchResult)
}
//ищем значения сумм объектов в массиве
function sumsPrice(arrSource, arrTarget, keyName) {
return arrSource.forEach(item => arrTarget.push(item[keyName]));
}
//суммируем массив значений
function getSumValues(arrSource) {
return arrSource.reduce((a, b) => a + b)
}
arrResults = addSearhToArr(arrResults, searhById(cards, 1));
sumsPrice(cards, prices, 'price')
console.log(arrResults);
console.log(prices);
console.log(getSumValues(prices));
Это имелось ввиду? P.S. Обрати внимание на свой массив "cards", скобки неверны.
Всё просто:
- Объявляем изначально пустой массив
results, куда будем складывать результаты нашей фильтрации - Добавляем в этот массив не просто результат, т.к. результат - это массив, а добавлем элементы результата с помощью синтаксиса spread
- С помощью reduce легко вычисляем сумму
const cards = [
{id: 1, title: 'яблоко', price: 61, photo: 'img/cards/card1.jpg'},
{id: 2, title: 'банан', price: 69, photo: 'img/cards/card2.jpg'},
{id: 3, title: 'киви', price: 119, photo: 'img/cards/card3.jpg'},
{id: 4, title: 'вишня', price: 169, photo: 'img/cards/card4.jpg'},
];
const filterById = (arr, id) => arr.filter(elem => elem.id === id);
const results = [];
const needToFind = [1, 3, 4];
needToFind.forEach(id => results.push(...filterById(cards, id)));
const sum = results.reduce((sum, elem) => sum + elem.price, 0);
console.log(results);
console.log(sum);
P.S. Если id всех объектов уникальны, то вместо filter лучше использовать find. Тогда вы будете получать не массив с одним объектом, а сам объект и код станет чутка лечге (не нужен будет синтаксис spread):
const cards = [
{id: 1, title: 'яблоко', price: 61, photo: 'img/cards/card1.jpg'},
{id: 2, title: 'банан', price: 69, photo: 'img/cards/card2.jpg'},
{id: 3, title: 'киви', price: 119, photo: 'img/cards/card3.jpg'},
{id: 4, title: 'вишня', price: 169, photo: 'img/cards/card4.jpg'},
];
const findById = (arr, id) => arr.find(elem => elem.id === id);
const results = [];
const needToFind = [1, 3, 4];
needToFind.forEach(id => results.push(findById(cards, id)));
const sum = results.reduce((sum, elem) => sum + elem.price, 0);
console.log(results);
console.log(sum);