【问题标题】:How to re structure the array dynamic way?如何重新构造数组的动态方式?
【发布时间】:2021-08-26 18:34:48
【问题描述】:

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

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

[
   {
      "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)

【问题讨论】:

  • 您能否以minimal reproducible example 的身份分享您遇到问题的代码?
  • 抱歉@evolutionxbox,我不能提供代码库,因为它是一个私人项目,非常感谢,您这边的任何解决方案来重新排列我上面提到的数组格式
  • 很抱歉给您带来了困惑。我不是要项目来源。只有minimal reproducible example 显示您遇到问题的代码。 StackOverflow 不是一个要求别人为你写代码的地方。
  • @evolutionxbox 用代码更新了帖子

标签: javascript arrays json multidimensional-array format


【解决方案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);

【讨论】:

【解决方案2】:

下面的代码应该适合你。

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);

【讨论】:

    【解决方案3】:

    Guys nullish assignment 在较旧的打字稿版本中不起作用,因此我稍微修改了代码。在这里。

    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);

    【讨论】:

      猜你喜欢
      • 2018-11-05
      • 1970-01-01
      • 2021-11-13
      • 2015-05-09
      • 1970-01-01
      • 1970-01-01
      • 2012-05-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多