首页 > 解决方案 > 如何通过更改参数名称来使用组更改数组对象格式?

问题描述

我最近开始使用 Javascript,并且对于下面的场景应该如何工作有点坚持。我已经经历了几个例子,但无法弄清楚。

const mobiles = [
    {
        BRAND_NAME: 'Samsung',
        MODEL_NAME: 'Galaxy Note 9',
        MANUFACTURE_DATE: '2021-11-02'
    },
    {
        BRAND_NAME: 'Samsung',
        MODEL_NAME: 'Galaxy S10',
        MANUFACTURE_DATE: '2021-10-02'
    },
    {
        BRAND_NAME: 'Apple',
        MODEL_NAME: 'Iphone X',
        MANUFACTURE_DATE: '2020-11-02'
    }
];

我必须按品牌名称转换上述数组对象和组。输出应如下所示 -

[{
  "brandname" : 'Samsung',
  "details" : [{
       modelname: 'Galaxy Note 9",
       manufacturedate: '2021-11-02'
      },
      {
       modelname: 'Galaxy S10'
       manufacturedate: '2021-10-02'
      }]
},
{
"brandname" : 'Apple',
  "details" : [{
       modelname: 'IPhone X",
       manufacturedate: '2020-11-02'
      }]
}      
]

我四处搜索,发现了各种文章,他们说如果你想要一个新的 Array 对象就使用 map 。我很困惑如何去做以及是否使用 map、reduce 或任何其他功能。

任何建议如何去做?

标签: javascriptnode.js

解决方案


您可以使用Array#reduce对象来存储每个品牌的模型。要重命名属性,您可以映射每个对象的条目并将其转换回具有Object.fromEntries.

const mobiles = [
    {
        BRAND_NAME: 'Samsung',
        MODEL_NAME: 'Galaxy Note 9',
        MANUFACTURE_DATE: '2021-11-02'
    },
    {
        BRAND_NAME: 'Samsung',
        MODEL_NAME: 'Galaxy S10',
        MANUFACTURE_DATE: '2021-10-02'
    },
    {
        BRAND_NAME: 'Apple',
        MODEL_NAME: 'Iphone X',
        MANUFACTURE_DATE: '2020-11-02'
    }
];
const res = Object.values(mobiles.reduce((acc, {BRAND_NAME, ...rest})=>{
  (acc[BRAND_NAME] ??= {brandname: BRAND_NAME, details: []}).details.push(
    Object.fromEntries(Object.entries(rest)
      .map(([k,v])=>[k.toLowerCase().replace('_', ''), v])));
  return acc;
}, {}));
console.log(res);


推荐阅读