var list = [{ 'orderSeries': 26342, 'make': 'audi', 'model': 'r8', 'year': '2012' }, { 'orderSeries': 26342, 'make': 'audi', 'model': 'rs5', 'year': '2013' }, { 'orderSeries': null, 'make': 'ford', 'model': 'mustang', 'year': '2012' }, { 'orderSeries': null, 'make': 'ford', 'model': 'fusion', 'year': '2015' }, { 'orderSeries': null, 'make': 'kia', 'model': 'optima', 'year': '2012' }];¿Es posible agrupar los primeros 2 objetos en esta matriz porque el valor de orderSeries es el mismo, y el resto de los objetos no se agrupan por la propiedad orderSeries porque el valor de esos es nulo?
y para obtener un formato de la matriz como este cuando está agrupado:
var list = [{ 'orderSeries': 26342, 'make': 'audi', cars: [ { 'model': 'r8', 'year': '2012'}, {'model': 'rs5', 'year': '2013'} ] }, { 'orderSeries': null, 'make': 'ford', 'model': 'mustang', 'year': '2012' }, { 'orderSeries': null, 'make': 'ford', 'model': 'fusion', 'year': '2015' }, { 'orderSeries': null, 'make': 'kia', 'model': 'optima', 'year': '2012' }]Usaría solo forEach y llenaría una nueva lista con algunas modificaciones
const list = [{ 'orderSeries': 26342, 'make': 'audi', 'model': 'r8', 'year': '2012' }, { 'orderSeries': 26342, 'make': 'audi', 'model': 'rs5', 'year': '2013' }, { 'orderSeries': null, 'make': 'ford', 'model': 'mustang', 'year': '2012' }, { 'orderSeries': null, 'make': 'ford', 'model': 'fusion', 'year': '2015' }, { 'orderSeries': null, 'make': 'kia', 'model': 'optima', 'year': '2012' }]; const groupedList = []; list.forEach(item => { if (!item.orderSeries) { groupedList.push(item); } else { const existingGroup = groupedList.find(i => i.orderSeries === item.orderSeries); if (existingGroup) { existingGroup.cars.push({ model: item.model, year: item.year }); } else { groupedList.push({ orderSeries: item.orderSeries, make: item.make, cars: [ { model: item.model, year: item.year } ] }); } } }); console.log(groupedList);Array#reduce , itere sobre la list mientras actualiza dos matrices, una para pedidos con orderSeries y otra sin ellaArray#reduce nuevamente, itere sobre la primera lista con orderSeries mientras actualiza un Map para agrupar los elementos por orderSeriesorderSeries const list = [ { 'orderSeries': 26342, 'make': 'audi', 'model': 'r8', 'year': '2012' }, { 'orderSeries': 26342, 'make': 'audi', 'model': 'rs5', 'year': '2013' }, { 'orderSeries': null, 'make': 'ford', 'model': 'mustang', 'year': '2012' }, { 'orderSeries': null, 'make': 'ford', 'model': 'fusion', 'year': '2015' }, { 'orderSeries': null, 'make': 'kia', 'model': 'optima', 'year': '2012' }]; const [ordersWithSeries, ordersWithoutSeries] = list.reduce(([a, b], order) => order.orderSeries ? [[...a, order], b] : [a, [...b, order]] , [[], []]); const groupedOrdersBySeries = [... ordersWithSeries.reduce((orderSeriesMap, { orderSeries, make, model, year }) => { const order = orderSeriesMap.get(orderSeries); if(!order) { orderSeriesMap.set(orderSeries, { orderSeries, make, cars: [{ model, year }] }); } else { order.cars.push({ model, year }); } return orderSeriesMap; }, new Map) .values() ]; const res = [...groupedOrdersBySeries, ...ordersWithoutSeries ]; console.log(res);Simplemente manipularía los datos originales uno por uno usando for loop.
const list = [{ orderSeries: 26342, make: "audi", model: "r8", year: "2012" }, { orderSeries: 26342, make: "audi", model: "rs5", year: "2013" }, { orderSeries: null, make: "ford", model: "mustang", year: "2012" }, { orderSeries: null, make: "ford", model: "fusion", year: "2015" }, { orderSeries: null, make: "kia", model: "optima", year: "2012" } ]; let mergeIndexes = []; let newList = []; const placeholder = { orderSeries: null, make: "", cars: [] }; for (let i = 0; i <= list.length - 1; i++) { // continue if current index is already merge with the previous if (mergeIndexes.includes(i.toString())) continue; const item = list[i]; const filter = list.filter((i) => i.orderSeries === item.orderSeries); if (filter.length && Boolean(item.orderSeries)) { placeholder.orderSeries = filter[0].orderSeries; placeholder.make = filter[0].make; placeholder.cars = filter.reduce( (prev, curr) => [...prev, { model: curr.model, year: curr.year }], [] ); newList = [...newList, placeholder]; // to keep track of the indexes that are already merge mergeIndexes = [...mergeIndexes, ...Object.keys(filter)]; } else { newList = [...newList, item]; } } console.log(newList);