使用下划线函数groupBy,可以按其元素的某个属性对数组进行分组。结果是具有如下所示的键值对的对象:group>相应的数组片段。
var words = ['Hey', 'Hii', 'Salut'],
grouped = _.groupBy(words, 'length');
分组看起来像这样:
{
'3': ['Hey', 'Hii'],
'5': ['Salut']
}
这将是一种简单而安全的迭代方法,例如从最高长度开始,然后是下一个最低长度。这有效:
_.each( _.toArray(grouped).reverse(), function(v) {
console.log(v);
} );
但我认为这不完全正确,因为对象是无序列表,正确的顺序恰好在这里发生。 对此有何评论?
答案 0 :(得分:9)
你是对的,你不能依赖对象键排序,你需要强制正确的排序。使用下划线,您可以使用_.sortBy
:
_.each(
_.sortBy(
_.toArray(grouped), function (num) {
return num;
}
).reverse(),
function (v) {
console.log(v);
}
);
答案 1 :(得分:6)
由于ES6's object properties traversal order,您可以使用Object.values()
以正确的顺序直接获取数组:
const words = ['Hombre', 'Muchachu', 'Hey', 'Hii', 'Salut'];
const grouped = _.groupBy(words, 'length');
console.log(JSON.stringify(grouped));
const array = Object.values(grouped).reverse();
console.log(JSON.stringify(array));

<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.9.1/underscore-min.js"></script>
&#13;
旧答案:
Object.keys(grouped) // get the keys as array
.sort(function(a, b) { return b - a; }) // sort them from highest to lowset
.forEach(function(lengthKey) { // iterate the sorted keys' array
console.log(grouped[lengthKey]); // get the words' arrays by key from grouped
});