2015-05-10 61 views
3

我試圖按average屬性按降序對對象數組排序 - 所以最大的average是第一個 - 但不能使用underscore.js。下面是我的嘗試:使用underscore.js按值排序對象數組

var jsonData = [ 
{ 
    "title": "Dear Kitten", 
    "totalCount": 1689, 
    "average": 241 
}, 
{ 
    "title": "Weird Things All Couples Fight About", 
    "totalCount": 9966, 
    "average": 1424 
}, 
{ 
    "title": "If Disney Princesses Were Real", 
    "totalCount": 16567, 
    "average": 2367 
}, 
{ 
    "title": "Secret Tricks With Everyday Objects", 
    "totalCount": 24884, 
    "average": 3555 
}, 
{ 
    "title": "The Coolest Travel Hacks", 
    "totalCount": 41847, 
    "average": 8369 
}, 
{ 
    "title": "5 Ways You're Drinking Coffee Wrong", 
    "totalCount": 55673, 
    "average": 7953 
}, 
{ 
    "title": "The Perfect Way To Pour A Beer", 
    "totalCount": 58097, 
    "average": 58097 
}, 
{ 
    "title": "Fruit You're Eating Wrong", 
    "totalCount": 65570, 
    "average": 32785 
}, 
{ 
    "title": "Your Cat Is Judging You", 
    "totalCount": 78952, 
    "average": 11279 
}, 
{ 
    "title": "3rd Date vs 30th Date", 
    "totalCount": 84394, 
    "average": 14066 
} 
]; 

console.log(_.sortBy(jsonData, "average")); 

jsFiddle

+1

??看起來它工作得很好。結果按「平均」屬性值的順序排序。 – Pointy

+1

你不在你的小提琴中包括下劃線:http://jsfiddle.net/y7h9cu6p/1/ –

+0

@RobM。 ?當我剛剛嘗試時,它就在那裏。 (這是OP的小提琴中的「外部資源」。) – Pointy

回答

2

這裏的問題是,你想數組中average降序順序進行排序,而不是默認的升序排列。

你可以通過提供一個自定義iteratee_.sortBy()功能做到這一點:

_.sortBy(jsonData, function(item) { return -item.average; }) 

Updated fiddle

但我不建議。它會好得多簡單地使用本地JavaScript [].sort()方法,併爲其提供一個比較函數:

jsonData.sort(function(a, b) { return b.average - a.average; }) 

Better fiddle

如果你整理一個非常大陣,這也將是比使用_.sortBy()更快。看看源代碼_.sortBy()明白爲什麼:

_.sortBy = function(obj, iteratee, context) { 
    iteratee = cb(iteratee, context); 
    return _.pluck(_.map(obj, function(value, index, list) { 
    return { 
     value: value, 
     index: index, 
     criteria: iteratee(value, index, list) 
    }; 
    }).sort(function(left, right) { 
    var a = left.criteria; 
    var b = right.criteria; 
    if (a !== b) { 
     if (a > b || a === void 0) return 1; 
     if (a < b || b === void 0) return -1; 
    } 
    return left.index - right.index; 
    }), 'value'); 
}; 

它在做什麼,除了.sort()電話相當多的工作 - 而這個代碼是冰山的一角,輔助功能,它調用像cb()也做很多工作。

爲什麼直接撥打.sort()直接就可以了?

而且,它需要冗長.sortBy()源的仔細閱讀,以確保它確實數字排序,而不是一個字典排序 - 和the documentation doesn't say

一個詞典排序(又名字母排序)是其中的值排序作爲字符串,而不是數字。因此,例如,它會使用這個命令:當你自己調用本機陣列.sort()

[ 1424, 2367, 241, ... ] 

,您可以輕鬆地驗證它使用數字排序:值b.average - a.average始終是一個數字。

+0

甜蜜,謝謝! – Shivam