0

I have a an array of products which I loop though and display them on an item. However it can happen that the same product gets chosen multiple times the same day and I therefore want the quantity to be displayed correctly but I'm not sure how to do that.

So my array looks forexample like this:

[
  {product_id: "679", quantity: "1", chosen_date: "2018-10-01"}
  {product_id: "675", quantity: "1", chosen_date: "2018-10-02"}
  {product_id: "675", quantity: "1", chosen_date: "2018-10-02"}
  {product_id: "675", quantity: "1", chosen_date: "2018-10-03"}
]

And here is my loop which displays each item

let elementWrapper = document.querySelectorAll('.items') 
for (var i = 0; i < items.length; i++){
    let elem = elementWrapper[i];
    let chosen_date = items[i].chosen_date;
    let product_id = items[i].product_id;
    let quantity = items[i].quantity;
    let span = document.createElement('span');
    span.innerHTML = moment(chosen_date).locale('da').format('Do MMM');
    elementWrapper[i].append(span);
}

where "items" is the array.

Like mentioned above, I want the product with the ID "675" which is chosen twice the "2018-10-02" to be displayed only once, with the quantity = 2

How can I achieve that?

Jonathan Hall
  • 75,165
  • 16
  • 143
  • 189
ST80
  • 3,565
  • 16
  • 64
  • 124

1 Answers1

0

var items = [
  {product_id: "679", quantity: 1, chosen_date: "2018-10-01",another:'a'},
  {product_id: "675", quantity: 1, chosen_date: "2018-10-02",another:'b'},
  {product_id: "675", quantity: 1, chosen_date: "2018-10-02",another:'a'},
  {product_id: "675", quantity: 1, chosen_date: "2018-10-03",another:'c'}
];

var incrementField = 'quantity';
var exceptFields = ['another'];
/**
* @param items [array] items as a multidimensional array
* @param incrementField [string]
* @param exceptFields [array]
**/
function plusArrays(items,incrementField,exceptFields=[]){
  // array with a filtered keys and values to help searching
  unique_arrays = [];
  // Original arrays
  unique_arrays_without_except = [];
  items.forEach(function(item){
    // Cloning the item
    original_item = JSON.parse(JSON.stringify(item));
    // Deleting the excep fields
    exceptFields.forEach(function(except){
      delete item[except];
    })
    // Getting the increment value before delting it
    var incrementValue = item[incrementField];
    // unsetting the incrementValue property
    delete item[incrementField];
    // Adding the increment value
    if(unique_arrays.indexOf(JSON.stringify(item))+1>0) {
  unique_arrays_without_except[unique_arrays.indexOf(JSON.stringify(item))][incrementField]+=incrementValue;
    } else {
      // Pushing the original item to original items list
      unique_arrays_without_except.push(original_item);
      // Pushing the filtered items to list
      unique_arrays.push(JSON.stringify(item));
    }
  });
  
  return unique_arrays_without_except;
}

console.log(plusArrays(items,incrementField,exceptFields))

Here is a funuction to do your job. cheers!