Допустим, у меня есть массив.

[ '219_1_undefined', '244_1_undefined', '248_1_20///179+25///153', '221_6_undefined' ]

Разбивка для отдельного элемента в массиве выглядит следующим образом: 219_1_undefined в основном это 219 это product_id, 1 это количество и undefined это product_options Я храню эту информацию в локальном хранилище. Теперь у меня есть новый товар, который нужно добавить в корзину, но этот товар уже находится в корзине, поэтому я хочу добавить только количество (среднее значение). Итак, я хочу снова добавить 219_1_undefined в существующий массив. Теперь массив будет выглядеть так.

[ '219_1_undefined', '244_1_undefined', '248_1_20///179+25///153', '221_6_undefined', '219_1_undefined' ]

Моя проблема в том, что я не знаю, как добавить среднее значение (количество) того же продукта и получить результат вроде

[ '244_1_undefined', '248_1_20///179+25///153', '221_6_undefined', '219_2_undefined' ]

Ниже приведен код, который я пробовал

let pid = 219;
let qty = 1;
let params = "undefined";

let string = '219_1_undefined|244|1_undefined|248_1_20///179+25///153|221_1_undefined';

let items = string.split('|');

 let nItem = pid+'_'+qty+'_'+params;
 let mx = items;
 mx = mx.filter(function (item) {
  return item.indexOf(pid+'_') !== 0;
  });
 mx.push(nItem);
 var result = mx.toLocaleString();
 let nresult = result.split(',').join('|');
      
 console.log(nresult);

Независимо от того, что я делаю, я все равно получаю неправильный результат.

0
Viira 22 Сен 2021 в 16:08

2 ответа

Лучший ответ

Вы можете попробовать получить index с помощью Array.prototype.findIndex() и обновите элемент массива, используя этот индекс :

let pid = 219;
let qty = 1;
let params = "undefined";

let items = ['219_1_undefined', '244_1_undefined', '248_1_20///179+25///153', '221_1_undefined'];

//get the index of the item from the array by matching the id
let index = items.findIndex(p => p.split('_')[0] == pid);
//check if any item is exist in the array
if(index > -1){
  //using the index update the item in the array with the new value
  items[index] = pid + '_' + (+items[index].split('_')[1] + qty) + '_' + params;
}
else{
  //push new item to the arry
  items.push(pid + '_' + qty + '_' + params);
}

console.log(items);
1
Mamun 22 Сен 2021 в 13:57
let pid = 219;
let qty = 1;
let params = "undefined";

let string = '219_1_undefined|244|1_undefined|248_1_20///179+25///153|221_1_undefined';
let items = string.split('|');
let i = 0;

for(; i < items.length; i++) {
  let temp = items[i].split('_');
  if (temp[0] == pid && temp[2] == params) {
    qty = parseInt(qty) + parseInt(temp[1]);
    break;
  }
}

items[i] = `${pid}_${qty}_${params}`;
string = items.join('|');

Я протестировал это, и, похоже, он работает. Оператор if сравнивает оба идентификатора и параметры, но, очевидно, вы можете проверить идентификатор только при желании.

0
Husman 22 Сен 2021 в 13:44