2017-10-19 112 views
1

我有一个数组:Lodash ORDERBY对象

const names = [{name: 'a', equal: 3}, 
{name: 'b', equal: 2}, 
{name: 'c', equal: 2}, 
{name: 'd', equal: 3}, 
{name: 'a1', equal: 1}] 

我运行_.groupBy(名称, '等于'),结果获得:

{1: [{equal: 1, name: 'a1'}], 
2: [{equal: 2, name: 'b'}, {equal: 2, name: 'c'}], 
3: [{equal: 3, name: 'a'}, {equal: 3, name: 'd'}]} 

但在这里按名称排序消失。如何在此对象中按名称排序?

更新

我想:

{3: [{equal: 3, name: 'a'}, {equal: 3, name: 'd'}], 
1: [{equal: 1, name: 'a1'}], 
2: [{equal: 2, name: 'b'}, {equal: 2, name: 'c'}]} 
+0

所以要排序相等,然后通过名称为对象进行排序以相同的平等吗? –

+0

是的,我想得到:{3:[{equal:3,name:'a'},{equal:3,name:'d'}]​​, 1:[{equal:1,name:'a1 '}], 2:[{equal:2,name:'b'},{equal:2,name:'c'}]} – user5671335

+0

对象有没有顺序或在即将到来的JS中,顺序是带整数值。 –

回答

1

通过使用数组作为结果集,可以在分组后对其进行排序。

var names = [{ name: 'a', equal: 3 }, { name: 'b', equal: 2 }, { name: 'c', equal: 2 }, { name: 'd', equal: 3 }, { name: 'a1', equal: 1 }], 
 
    equals = {}, 
 
    result = []; 
 

 
names.forEach(function (o) { 
 
    if (!equals[o.equal]) { 
 
     equals[o.equal] = []; 
 
     result.push(equals[o.equal]); 
 
    } 
 
    equals[o.equal].push(o); 
 
}); 
 

 
result.sort(function (a, b) { 
 
    return a[0].name.localeCompare(b[0].name); 
 
}); 
 

 
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

1

可以使用lodash方法GROUPBY和sortBy一起

DEMO

const names = [{name: 'a', equal: 3}, 
 
{name: 'b', equal: 2}, 
 
{name: 'c', equal: 2}, 
 
{name: 'd', equal: 3}, 
 
{name: 'a1', equal: 1}]; 
 

 
var grouped = _.groupBy(names, function(name) { 
 
    return name.equal; 
 
}); 
 
var result = _.sortBy(grouped, ['name']); 
 
console.log(grouped);
<script src='https://cdn.jsdelivr.net/lodash/4.17.2/lodash.min.js'></script>

+0

与_.groupBy(names,'equal')的区别? – user5671335

+0

抱歉误解了 – Sajeetharan

+0

这个不行! – user5671335