Объединить элементы массива [дубликат]

144
09 марта 2019, 08:50

На данный вопрос уже ответили:

  • Как посчитать количество повторений каждого значения в массиве? 4 ответа

Нужно найти все повторяющиеся products.id и объединить quantity. Должно получиться вот так:

products = [{id: 5, quantity: 25}, {id: 3, quantity: 15}, {id: 4, quantity: 164}]

const arr = [{ 
    id: 1, 
    products: [{ 
      id: 5, 
      quantity: 5 
    }, { 
      id: 3, 
      quantity: 2 
    }] 
  }, 
  { 
    id: 2, 
    products: [{ 
      id: 4, 
      quantity: 75 
    }, { 
      id: 5, 
      quantity: 20 
    }] 
  }, 
  { 
    id: 3, 
    products: [{ 
      id: 3, 
      quantity: 13 
    }, { 
      id: 4, 
      quantity: 89 
    }] 
  }, 
] 
 
let allProducts = []; 
let products = []; 
 
function getAllProducts() { 
  arr.forEach(value => { 
    value.products.forEach(product => allProducts.push(product)) 
  }) 
  concatProducts(allProducts) 
} 
 
function concatProducts(arr) { 
  arr.reduce(function(a, b) { 
    return a.id === b.id ? products.push({ 
      id: a.id, 
      quantity: a.quantity + b.quantity 
    }) : products.push(b); 
  }); 
  console.log(products) 
} 
 
getAllProducts()

Answer 1

const arr = [ 
  { 
    id: 1, 
    products: [ 
      {id: 5, quantity: 5}, 
      {id: 3, quantity: 2} 
    ] 
  }, { 
    id: 2, 
    products: [ 
      {id: 4, quantity: 75}, 
      {id: 5, quantity: 20} 
    ] 
  }, { 
    id: 3, 
    products: [ 
      {id: 3, quantity: 13}, 
      {id: 4, quantity: 89} 
    ] 
  } 
]; 
 
function getAllProducts(arr) { 
  const allProducts = {}; 
  arr.forEach(value => { 
    value.products.forEach(prod => { 
      if (allProducts[prod.id] === undefined) 
        allProducts[prod.id] = prod.quantity; 
      else 
        allProducts[prod.id] += prod.quantity; 
    }); 
  }) 
  const products = []; 
  for (let id in allProducts) { 
    products.push({id: id, quantity: allProducts[id]}); 
  } 
  return products; 
} 
 
console.log(getAllProducts(arr));

Answer 2

const arr = [{ 
    id: 1, 
    products: [ 
      { id: 5, quantity: 5 },  
      { id: 3, quantity: 2 } 
    ] 
  }, 
  { 
    id: 2, 
    products: [ 
      { id: 4, quantity: 75 }, 
      { id: 5, quantity: 20 } 
    ] 
  }, 
  { 
    id: 3, 
    products: [ 
      { id: 3, quantity: 13 },  
      { id: 4, quantity: 89 } 
    ] 
  }, 
] 
 
var res = arr.reduce((res, item) => { 
  item.products.reduce((res, item) => { 
    if (!res[item.id]) 
      res[item.id] = 0; 
    res[item.id] += item.quantity; 
    return res; 
  }, res); 
  return res; 
}, {}); 
 
var result = []; 
for (var key in res) 
  result.push({ id: +key, quantity: res[key]}); 
   
console.log(result);

READ ALSO
Динамическое отображение типов в Grid в Extjs

Динамическое отображение типов в Grid в Extjs

У меня есть store со значениями, где хранятся типы данных и их обозначения с id и тд

131
Изменить span на input

Изменить span на input

Подскажите пожалуйста, есть код в котором по нажатию на span изменяется на input

125
Как сделать clear (C) для калькулятора на JavaScript

Как сделать clear (C) для калькулятора на JavaScript

Мне нужно сделать кнопку C, при нажатии на которую очищаются 4 параграфа с id = out, out1, out2, out3

125
Select2 Yii2 работа с атрибутом tags

Select2 Yii2 работа с атрибутом tags

Всем приветПодскажите пожалуйста как можно реализовать добавление новых элементов option в select

163