Сгруппируйте объекты json в массив на основе уникального идентификатора. - PullRequest
0 голосов
/ 01 октября 2019

Например, это json, который я получаю. Json группирует это

var data = [{
        orderid: 1,
        ordername:ordername1,
        productcode: 1,
        productname: product1,
        productquantity: 10
    },
    {
        orderid: 2,
        ordername:ordername2,
        productcode: 2,
        productname: product2,
        productquantity: 11
    },
    {
        orderid: 1,
        ordername:ordername3,
        productcode: 3,
        productname: product3,
        productquantiy: 45
    }
]

Ожидаемый результат

[
{
    orderid: 1,
    ordername:ordername1,
    products: [
    {
        productcode: 1,
        productname: product1,
        productquantity: 10
    },
    {
        productcode: 3,
        productname: product3,
        productquantity: 45
    }]
},
{
    orderid: 2,
    ordername:ordername2,
    products: [
    {
        productid: 2,
        productname: product2,
        productquantity: 11
    }]
}]   

Как это сделать в реагировать на нативный. Как сгруппировать это на основе orderid. Теперь я добавил название заказа также, как включить это также

Ответы [ 2 ]

1 голос
/ 02 октября 2019

Легко достижимо, используя Array.reduce

var data = [{
    orderid: 1,
    ordername: 'ordername1',
    productcode: 1,
    productname: 'product1',
    productquantity: 10
  },
  {
    orderid: 2,
    ordername: 'ordername2',
    productcode: 2,
    productname: 'product2',
    productquantity: 11
  },
  {
    orderid: 1,
    ordername: 'ordername3',
    productcode: 3,
    productname: 'product3',
    productquantity: 45
  }
];


// reduce iterates over each item, using accumulator
var orderedData = data.reduce((acc, next) => {

  // reusable product var
  var nextProduct = {
    productcode: next.productcode,
    productname: next.productname,
    productquantiy: next.productquantity
  }

  // find similar orders, and join them
  var exist = acc.find(v => v.orderid === next.orderid);
  if (exist) {

    // order exists, update its products
    exist.products.push(nextProduct);
  } else {

    // create new order
    acc.push({
      orderid: next.orderid,
      ordername: next.ordername,
      products: [nextProduct]
    })
  }
  return acc
}, [])

console.log(orderedData)
0 голосов
/ 01 октября 2019

Попытка реализации в общем

function group(data,property,extra=[]){
	let output=[]
	data.forEach(item=>{
		const indexOfItem=output.length>0 ?output.findIndex(outputItem=>outputItem[property]===item[property]):-1
		if(indexOfItem===-1){
            let tempOutput={}
            extra.forEach(key=>{
             if(item[key]){tempOutput[key]=item[key]}
            })
			let {[property]:propertyValue,...rest}=item;
			output.push({[property]:propertyValue,...tempOutput,products:[{...rest}]})
		}
		else{
			let {[property]:propertyValue,...rest}=item;
			output[indexOfItem].products.push({...rest})
		}
	})
	return output
}

var data = [{
        orderid: 1,
        ordername:'order1',
        productcode: 1,
        productname: "product1",
        productquantity: 10
    },
    {
        orderid: 2,
        ordername:'order2',
        productcode: 2,
        productname: "product2",
        productquantity: 11
    },
    {
        orderid: 1,
        ordername:'order3',
        productcode: 3,
        productname: "product3",
        productquantiy: 45
    }
]

console.log(group(data,'orderid',['ordername']))
//console.log(group(data,'productcode'))

Теперь вы можете использовать group(data,"property name")

...