2015-10-02 131 views
2

我有對象的列表:使用lodash從對象列表中獲取最大屬性?

var objects = [ 
    {name: 'Fred', age: 63, height: 12}, 
    {name: 'Jane', age: 32, height: 32}, 
    {name: 'Dune', age: 12, height: 555} 
]; 

我想看看什麼所有最大的屬性是:

var maximums = magic(objects); 
// {name: 'Jane', age: 63, height: 555} 

有沒有簡單的方法來做到這一點?沒有手動循環。

回答

1

可以_.merge()在減少環路(lodash或ES5)的對象,並使用該合併的customizer功能採取道具在每個迭代的最大值。

var objects = [ 
 
    {name: 'Fred', age: 63, height: 12}, 
 
    {name: 'Jane', age: 32, height: 32}, 
 
    {name: 'Dune', age: 12, height: 555} 
 
]; 
 

 
var maximums = _(objects).reduce(function(obj, item) { 
 
    return _.merge(obj, item, function(a, b) { 
 
    return a > b ? a : b; 
 
    }); 
 
}, {}); 
 

 
document.write(JSON.stringify(maximums));
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/3.10.1/lodash.js"></script>

0

我看不出如何在沒有某種迭代或循環的情況下做到這一點:首先通過對象數組,然後遍歷每個對象的屬性以獲得最大值。

自ES5以來,有一些本地方法可以完成此任務,但如果性能問題很重要,普通循環會更快(而且代碼也不會太多)。

var objects = [ 
 
    {name: 'Fred', age: 63, height: 12}, 
 
    {name: 'Jane', age: 32, height: 32}, 
 
    {name: 'Dune', age: 12, height: 555} 
 
]; 
 

 
var maxes = objects.reduce(function(acc, obj) { 
 
    Object.keys(obj).forEach(function(key) { 
 
    acc[key] = acc[key] > obj[key]? acc[key] : obj[key]; 
 
    }); 
 
    return acc; 
 
},{}); 
 

 
document.write(JSON.stringify(maxes));

相關問題