根据相同的值对数组进行分组

时间:2021-02-10 10:44:17

标签: javascript arrays group-by

我的数组是这样的:

myArray = [
  {SKU: "Hoo12", Name: "ACyrlic watch",OrderNo:"26423764233456"},
  {SKU: "S0002", Name: "Princes Geometry",OrderNo:"124963805662313"},
  {SKU: "Hoo12", Name: "ACyrlic watch",OrderNo:"122324234234"},
]


I want to convert

OutPut = [
  {SKU: "Hoo12",Name: "ACyrlic watch", OrderNo: ["26423764233456", "122324234234"]}
  {SKU: "S0002", Name: "Princes Geometry", OrderNo: ["124963805662313"]}
]

我想尝试很多方法,但我只是不知道如何处理相似组值的分组。

3 个答案:

答案 0 :(得分:1)

每当您看到分组数据时,Array.reduce 都是一个不错的选择。

例如

const myArray = [
  {SKU: "Hoo12", Name: "ACyrlic watch",OrderNo:"26423764233456"},
  {SKU: "S0002", Name: "Princes Geometry",OrderNo:"124963805662313"},
  {SKU: "Hoo12", Name: "ACyrlic watch",OrderNo:"122324234234"},
];

const OutPut = myArray.reduce((a,v) => {
  let c = a.find(f => f.SKU === v.SKU);
  //do we have this SKU..
  if (!c) {
    //No lets add
    c = v;
    c.OrderNo = [v.OrderNo];
    a.push(c);
  } else {
    //Yes, lets add this OrderNo.
    c.OrderNo.push(v.OrderNo);
  }
  return a;
}, []);

console.log(OutPut);

答案 1 :(得分:1)

使用 reduce 方法,您可以达到预期的输出

const myArray = [ {SKU: "Hoo12", Name: "ACyrlic watch",OrderNo:"26423764233456"}, {SKU: "S0002", Name: "Princes Geometry",OrderNo:"124963805662313"}, {SKU: "Hoo12", Name: "ACyrlic watch",OrderNo:"122324234234"}];

const result = Object.values(myArray.reduce((a,{OrderNo, ...r})=>{
    a[r.SKU] ??= {...r, OrderNo:[]};
    a[r.SKU].OrderNo.push(OrderNo)
    return a;
},{}));

console.log(result);

答案 2 :(得分:0)

一个简单的 forEach 应该做的,如果你不想修改初始的 myArray(纯函数)

// Initialization
myArray = [
  {SKU: "Hoo12", Name: "ACyrlic watch",OrderNo:"26423764233456"},
  {SKU: "S0002", Name: "Princes Geometry",OrderNo:"122324234234"},
  {SKU: "Hoo12", Name: "ACyrlic watch",OrderNo:"122324234234"},
]

OutPut = []

// For each element of the array
myArray.forEach(elem => {
  // find the one that match with SKU and Name
  let found = OutPut.find(o => o.SKU == elem.SKU && o.Name == elem.Name)
  // if it present add the OrderNo
  if (found) {
    found.OrderNo.push(elem.OrderNo)
  }
  // else add the object with OrderNo as an Array
  else {
    OutPut.push({ SKU: elem.SKU, Name: elem.Name, OrderNo: [ elem.OrderNo ] })
  }
})


// Show output
let c = document.createElement('pre');
c.innerText = JSON.stringify(OutPut, null, 2)
document.body.appendChild(c)

相关问题