【问题标题】:Sorting JS array of objects with 2 criteria使用 2 个条件对 JS 对象数组进行排序
【发布时间】:2020-02-03 10:20:12
【问题描述】:

我有一个对象数组:

[{cat:A,size:2},
{cat:B,size:2},
{cat:B,size:1},
{cat:A,size:3},
{cat:C,size:5},
{cat:B,size:3}]

我想先按类别对这个数组进行排序,然后按每个类别中的 asc 大小排序。结果数组将是:

[{cat:A,size:2},
{cat:A,size:3},
{cat:B,size:1},
{cat:B,size:2},
{cat:B,size:3},
{cat:C,size:5}]

我目前正在将数组按 cat 划分为临时子集,然后按大小对它们中的每一个进行排序并加入...但是我有 100000+ 个值要排序,我相信有更好/更快的方法。如果有帮助,我的项目中包含 underscore.js。猫的数量是动态的......有什么建议吗?

【问题讨论】:

标签: javascript arrays sorting underscore.js


【解决方案1】:

只需执行两个比较。如果类别不同,则无需比较大小。

yourArray.sort(function(e1, e2) {
  if (e1.cat < e2.cat) return -1;
  if (e1.cat > e2.cat) return 1;
  // categories must be the same, so order by size
  if (e1.size < e2.size) return -1;
  if (e1.size > e2.size) return 1;
  return 0;
});

【讨论】:

    【解决方案2】:

    当类别相等时,顺序由大小值定义。
    否则,顺序由类别定义。
    看到它在这里工作:https://codepen.io/JuanLanus/pen/bGNXYBL?editors=1011
    请记住,它通过返回负值、零值或正值来工作;无需返回 +1 或 -1。

    let catSizes = [  
      { cat: 'A', size: 2 },  
      { cat: 'B', size: 2 },  
      { cat: 'B', size: 1 },  
      { cat: 'A', size: 3 },  
      { cat: 'C', size: 5 },  
      { cat: 'B', size: 3 }  
    ];  
    
      catSizes.sort( ( a, b ) => {  
        if( a.cat === b.cat ){ return a.size - b.size }  
        return a.cat > b.cat ? 1 : -1;  
      });````
    

    【讨论】:

      猜你喜欢
      • 2022-12-02
      • 1970-01-01
      • 2021-06-11
      • 2016-10-02
      • 1970-01-01
      • 1970-01-01
      • 2021-02-23
      • 1970-01-01
      相关资源
      最近更新 更多