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

Sort object keys by the number of elements in the array stored in each in JavaScript

我有一个项目,我收到一份产品清单,然后按制造商分组。我想以编程方式在页面上显示这些,但需要按产品从多到少的顺序显示。我需要想出一种算法来将对象键从最多产品排序到最少产品。

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

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'}
  ]
}

我需要对数据进行排序,因此首先是制造商最多,然后下降到制造商最少。所以需要修改成这样:

{
  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'}
  ],
}

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

我正在寻找有关 how to sort object keys alphabetically 和其他类似相关算法的教程,但没有完全做到这一点的教程。我已经开始尝试自定义一些基本的排序算法,但数据操作不是我的强项,所以它们要么失败要么变成臃肿的意大利面条代码混乱。

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

如果有人能提供任何建议,我将不胜感激。提前谢谢你

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

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)

如果你在对象上循环,我不会将它转换回一个对象,我只会使用 Object.entries 并基于它输出我的数据。