如何重新构造数组动态方式?

时间:2021-06-09 18:01:42

标签: javascript arrays json multidimensional-array format

以下是我目前拥有的数组格式

<块引用>

有多个这样的类别,这是提供的一个例子

[
   {
      "itemId":"123",
      "itemName":"name 1",
      "category":"electric",
      "salePersonName":"person name 1"
   },
   {
      "itemId":"234",
      "itemName":"name 2",
      "category":"electric",
      "salePersonName":"person name 2"
   }{
      "itemId":"345",
      "itemName":"name 3",
      "category":"electric",
      "salePersonName":"person name 3"
   }
]

但是我需要将其重组为以下格式,我该如何以动态方式执行此操作,

[
   {
      "category":"electric",
      "items":[
         {
            "temId":"123",
            "itemName":"name 1"
         },
         {
            "itemId":"234",
            "itemName":"name 2"
         },
         {
            "itemId":"345",
            "itemName":"name 3"
         }
      ],
      "salePersons":[
         {
            "salePersonName":"person name 1"
         },
         {
            "salePersonName":"person name 2"
         },
         {
            "salePersonName":"person name 3"
         }
      ]
   }
]
<块引用>

下面是我之前尝试过的代码,但没有给出预期的输出

   

 

const array = [{
    "itemId": "123",
    "itemName": "name 1",
    "category": "electric",
    "salePersonName": "person name 1"
  },
  {
    "itemId": "234",
    "itemName": "name 2",
    "category": "electric",
    "salePersonName": "person name 2"
  }, {
    "itemId": "345",
    "itemName": "name 3",
    "category": "electric",
    "salePersonName": "person name 3"
  },
  {
    "itemId": "34111",
    "itemName": "name 4",
    "category": "newCategory",
    "salePersonName": "person name 5"
  }
];
let result = {};
array.forEach(function(o) {
  result[o.category] = result[o.category] || {};
  result[o.category]['items'] = [{
    "itemId": result[o.itemId],
    "itemName": result[o.itemName]
  }];
  result[o.category]['salePersons'] = [{
    "salePersonName": result[o.salePersonName]
  }];
});

console.log("result", result)

3 个答案:

答案 0 :(得分:1)

const input = [
   {
      "itemId":"123",
      "itemName":"name 1",
      "category":"electric",
      "salePersonName":"person name 1"
   },
   {
      "itemId":"234",
      "itemName":"name 2",
      "category":"electric",
      "salePersonName":"person name 2"
   },{
      "itemId":"345",
      "itemName":"name 3",
      "category":"electric",
      "salePersonName":"person name 3"
   }
]
const temp = input.reduce((acc, {itemId, itemName, category, salePersonName}) => {
  const entry = (acc[category] ??= {items: [], salePersons:[]})
  entry.items.push({ itemId, itemName });
  entry.salePersons.push({ salePersonName });
  return acc;
},{})

const result = Object.entries(temp).map(([category, data]) => ({ category, ...data }))

console.log(result);

答案 1 :(得分:0)

下面的代码应该适合你。

let result = {};
arr.forEach(function(o) {
  result[o.category] = result[o.category] || {};
  result[o.category]['items'] = result[o.category]['items'] || [];
  result[o.category]['items'].push({
    "itemId": o.itemId,
    "itemName": o.itemName
  });
  result[o.category]['salePersons'] = result[o.category]['salePersons'] || [];
   result[o.category]['salePersons'].push({
    "salePersonName": o.salePersonName
  });
});

console.log("result", result);

答案 2 :(得分:0)

伙计们无效的分配在有点旧的打字稿版本中不起作用,所以我稍微修改了代码。在这里。

const input = [{
    "itemId": "123",
    "itemName": "name 1",
    "category": "electric",
    "salePersonName": "person name 1"
  },
  {
    "itemId": "234",
    "itemName": "name 2",
    "category": "electric",
    "salePersonName": "person name 2"
  }, {
    "itemId": "345",
    "itemName": "name 3",
    "category": "electric",
    "salePersonName": "person name 3"
  },
  {
    "itemId": "456",
    "itemName": "name 5",
    "category": "Toys",
    "salePersonName": "person name 3"
  }
]
const temp = input.reduce((acc, {
  itemId,
  itemName,
  category,
  salePersonName
}) => {
  let entry;
  if (acc[category] != null || acc[category] != undefined) {
    entry = acc[category]
  } else {
    entry = acc[category] = {
      items: [],
      salePersons: []
    }
  }
  entry.items.push({
    itemId,
    itemName
  });
  entry.salePersons.push({
    salePersonName
  });
  return acc;
}, {})

const result = Object.entries(temp).map(([category, data]) => ({
  category,
  ...data
}))

console.log(result);

相关问题