Как объединить объекты с одинаковыми свойствами?

Здравствуйте.
Делаю корзину на wordpress через cookie и столкнулся с проблемой. Не могу объединить объекты с одинаковым свойством. Я пока что падаван и многого не знаю, нуждаюсь в помощи

В куки передаётся 2 параметра id на страницу(Каждый товар - это отдельная страница) и количество. Если покупатель кликнет дважды на товар, то в cookie окажется два одинаковых объекта. Мне нужно их слить в 1 и увеличить количество.
Уже пару часов не могу этого добится... Помогите пожалуйста. Мне хотя бы ссылочку на что то похожее , или ваш пример. Зарание спасибо

Вот что у меня имеется:
document.querySelectorAll('.button-add-to-cart').forEach(function(button) {
    button.onclick = cookieFunction
})
function cookieFunction(event) {
    event.preventDefault();
    let target = event.currentTarget

    let params = {
        'pageID': target.parentNode.querySelector('.page-id').value,
        'amount': target.parentNode.querySelector('.amount__input').value,
    }

    addCookie('params', params)
}

function combineCookie(value) {
//Сейчас на выходе 
[{pageID: "190", amount: "1"}, {pageID: "191", amount: "1"}, {pageID: "190", amount: "2"}]
// вот тут надо сделать объединение одинаковых товаров, что бы получилось
[{pageID: "190", amount: "3"}, {pageID: "191", amount: "1"}]

}
function addCookie(name, params) {
    let value = parseCookie(name); 
    value.push(params)

    combineCookie(value)

    Cookies.set(name, value, { expires: 7, path: '/' }); // либа js.cookie
}
function parseCookie(name) {
    let jsObjects = Cookies.getJSON(name);
    let arr = [];
    for (var i in jsObjects) {
    arr.push( jsObjects[i] );
  }

  return arr;
}
  • Вопрос задан
  • 417 просмотров
Решения вопроса 2
dollar
@dollar
Делай добро и бросай его в воду.
Например, так:
var data = [{pageID: "190", amount: "1"}, {pageID: "190", amount: "2"}];

function combineObjects(data) {
	let arr = [];
	data.forEach(obj=>{
		let pageID = obj.pageID;
		arr[pageID] = arr[pageID] || {pageID: pageID, amount: 0};
		arr[pageID].amount = +arr[pageID].amount+ +obj.amount+'';
	});
	return arr.filter(e=>e);
}

console.log(sumObjects(data)); // [{pageID: "190", amount: "3"}]
Ответ написан
@En-Tilza Автор вопроса
Спасибо за ответы.
Устроил себе мозговой штурм и победил задачу
function combineCookie(value) {

   for (let gIndex = 0; gIndex < value.length; gIndex++) {
     const element = value[gIndex];
     const { pageID } = element;

     for (let lIndex = 0; lIndex < value.length; lIndex++) {
       const _element = value[lIndex];

       if (pageID === _element.pageID && gIndex !== lIndex) {
         value[gIndex].amount = (parseInt(value[gIndex].amount) + parseInt(value[lIndex].amount)).toString();
         const idx = value.indexOf(value[lIndex]);
         if (idx !== -1) {
           value.splice(idx, 1);
         }
       }
     }
   }
   return value


}
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@StockholmSyndrome
проще проверять, есть ли уже элемент с таким pageID или нет, если есть — увеличивать amount, нет — добавлять новый элемент
let item = value.find((item) => item.pageID === params.pageID); 
if (item) {
  item.amount += params.amount;
} else {
  value.push(params);
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы