我有一个对象数组:
[{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。猫的数量是动态的......有什么建议吗?
答案 0 :(得分:3)
只需进行两次比较。如果类别不同,则无需比较大小。
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;
});
答案 1 :(得分:0)
当类别相等时,顺序由大小值定义。
否则,顺序由类别定义。
看到它在这里工作: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;
});````