2016-05-12 48 views
2

我在這裏有一個對象數組。下劃線:查找數組中最頻繁出現的對象?

var list = [ 
    {"id": 439, "name": "John"}, 
    {"id": 439, "name": "John"}, 
    {"id": 100, "name": "Kevin"}, 
    {"id": 120, "name": "Max"}, 
    {"id": 439, "name": "John"} 
]; 

我需要從這個數組中提取最常出現的對象,並按照最常用的名稱排序它。

到目前爲止,我已經嘗試遵循它從這個話題所做的那樣:Underscore.js: Find the most frequently occurring value in an array?

// Build temp list 
temp_list = _(
    _.chain(
     _(list).pluck('id') 
    ) 
    .countBy() 
    .pairs() 
    .value() 
) 
.sortBy(1) 
.reverse(); 

// Build final list with most frequently occurring first 
_.map(temp_list, function(current) { 
    return _.findWhere(list, { 
     'id': parseInt(current[0]) 
    }); 
}); 

莫非存在的方式通過排序直接初始列表,而無需創建一個臨時表來改善這個代碼?

+1

數組中的所有對象都不相同。如果兩個對象的'id'和'name'屬性重合,您是否想要考慮兩個對象?只有'id'? – Oriol

回答

1

你剛剛得到它:你可以打電話給reverse撥打地圖。以下是我做的:

var newlist = _.chain(list) 
    .countBy(function (item) { return item.id; }) 
    .pairs() 
    .sortBy(function (item) { return item[1]; }) 
    .reverse() 
    .map(function (item) { return _.findWhere(list, { id: parseInt(item[0]) }); }) 
    .value(); 

細目:

:返回數組的包裝版本,它可以讓你鏈強調的功能。

countBy:返回一個對象,其中的鍵是從回調函數返回的值,值是這些鍵發生的次數。

:轉換{ key: 'value' }['key', 'value']

sortBy:返回由值排序的陣列從回調

反向返回:反轉陣列

地圖:返回一個新的數組,其中每個項目都基於該數組中原始數組中的項目x以及在回調中對該值做了什麼。在這種情況下,我們使用iditem[0])從原始列表中獲取對象。

value:展開鏈式對象並返回「原始」值。

0

您可以使用reduce,獲得的項目數,後一個sortBy

像這樣的事情

var list = [ 
 
    {"id": 439, "name": "John"}, 
 
    {"id": 439, "name": "John"}, 
 
    {"id": 100, "name": "Kevin"}, 
 
    {"id": 120, "name": "Max"}, 
 
    {"id": 439, "name": "John"} 
 
]; 
 

 
var finalList = _.chain(list) 
 
\t .reduce(function(memo, item){ 
 
\t var previous = _.findWhere(memo,{id:item.id}); 
 
    if(previous){ 
 
    \t previous.count++; 
 
    }else{ 
 
    \t item.count=1; 
 
    \t memo.push(item); 
 
    } 
 
    return memo; 
 
},[]) 
 
\t .sortBy('count') 
 
    .reverse() 
 
    .value();
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>

1
_.chain(list) 
    .countBy("id").pairs().sortBy() 
    .reverse().map(function (element) {return _.findWhere(list, { id: parseInt(element[0]) }); }).value() 

var list = [ 
 
    {"id": 439, "name": "John"}, 
 
    {"id": 439, "name": "John"}, 
 
    {"id": 100, "name": "Kevin"}, 
 
    {"id": 120, "name": "Max"}, 
 
    {"id": 439, "name": "John"} 
 
]; 
 
var result = _.chain(list) 
 
    .countBy("id").pairs().sortBy() 
 
    .reverse().map(function (element) {return _.findWhere(list, { id: parseInt(element[0]) }); }).value(); 
 
console.log(result); 
 
document.write(JSON.stringify(result));
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>