在 JavaScript 中按数组中存储的元素数量对对象键进行排序

phu*_*der -3 javascript sorting reactjs

我有一个项目,我收到一份产品列表,然后按制造商对其进行分组。我想以编程方式在页面上显示这些内容,但需要按照产品最多到最少的顺序执行此操作。我需要想出一种算法来将对象键从最多产品排序到最少产品。

这是我所拥有的以及我需要到达的位置的简化示例:

let devices = {
  Sony: [
    {name: 'Experia 1', productCode: 's1'}, 
    {name: 'Experia 2', productCode: 's2'}
  ],
  Apple: [
    {name: 'iPhone 8', productCode: 'a1'}, 
    {name: 'iPhone 9', productCode: 'a2'}, 
    {name: 'iPhone 10', productCode: 'a3'}, 
    {name: 'iPhone 11', productCode: 'a4'}
  ],
  Huawei : [
    {name: 'S 21', productCode: 'h1'}
  ],
  LG: [
    {name: 'V60', productCode: 'l1'},
    {name: 'V60 Ultra', productCode: 'l2'},
    {name: 'G7', productCode: 'l3'}
  ]
}
Run Code Online (Sandbox Code Playgroud)

我需要对数据进行排序,以便首先从最多的制造商开始,然后下降到最少的制造商。因此需要修改为如下所示:

{
  Apple: [
    {name: 'iPhone 8', productCode: 'a1'}, 
    {name: 'iPhone 9', productCode: 'a2'}, 
    {name: 'iPhone 10', productCode: 'a3'}, 
    {name: 'iPhone 11', productCode: 'a4'}
  ],
  LG: [
    {name: 'V60', productCode: 'l1'},
    {name: 'V60 Ultra', productCode: 'l2'},
    {name: 'G7', productCode: 'l3'}
  ]
  Sony: [
    {name: 'Experia 1', productCode: 's1'}, 
    {name: 'Experia 2', productCode: 's2'}
  ],
  Huawei : [
    {name: 'S 21', productCode: 'h1'}
  ],
}
Run Code Online (Sandbox Code Playgroud)

提供的设备经常会有所不同,因此我需要在用户每次访问页面时对这些数据进行排序。因此,我正在寻找最短的语法来实现这一目标。

我正在寻找有关如何按字母顺序对对象键进行排序的教程以及其他类似的相关算法,但没有一个完全可以做到这一点。我已经开始尝试自定义一些基本的排序算法,但数据操作不是我的强项,因此它们要么失败,要么变成臃肿的意大利面条代码混乱。

是否有一种简短且简单的方法来转换所描述的数据?也许有一种排序方法或设计模式特别适合该任务。我一直在研究 lodash 命令,但没有找到任何可以立即跳出的解决方案。

我将非常感谢任何人可以提供的任何建议。先感谢您

epa*_*llo 5

您可以将其转换为数组,按长度排序,然后将其转换回对象。

let devices = {
  Sony: [
    {name: 'Experia 1', productCode: 's1'}, 
    {name: 'Experia 2', productCode: 's2'}
  ],
  Apple: [
    {name: 'iPhone 8', productCode: 'a1'}, 
    {name: 'iPhone 9', productCode: 'a2'}, 
    {name: 'iPhone 10', productCode: 'a3'}, 
    {name: 'iPhone 11', productCode: 'a4'}
  ],
  Huawei : [
    {name: 'S 21', productCode: 'h1'}
  ],
  LG: [
    {name: 'V60', productCode: 'l1'},
    {name: 'V60 Ultra', productCode: 'l2'},
    {name: 'G7', productCode: 'l3'}
  ]
}

devices = Object.fromEntries(Object.entries(devices).sort( (a,b) => b[1].length - a[1].length));

console.log(devices)
Run Code Online (Sandbox Code Playgroud)

如果您循环访问该对象,我不会将其转换回对象,我只会Object.entries基于该对象使用并输出我的数据。