迭代从 _.groupBy 检索到的对象

iterate over an object retrieved from _.groupBy

使用下划线函数 groupBy,数组可以按其元素的属性之一进行分组。结果是一个具有如下键值对的对象:group > corresponding array fragment.

var words = ['Hey', 'Hii', 'Salut'],
    grouped = _.groupBy(words, 'length');

分组看起来像这样:

{
  '3': ['Hey', 'Hii'],
  '5': ['Salut']
}

这将是一种简单而安全的迭代方法,比如从最高长度开始,然后是下一个最低长度。这有效:

_.each( _.toArray(grouped).reverse(), function(v) {
  console.log(v);
} );

但我认为这并不完全正确,因为对象是无序列表,正确的顺序只是偶然发生在这里。 对此有何评论?

你是对的,你不能依赖对象键排序,你需要强制执行正确的排序。使用下划线,您可以使用 _.sortBy:

_.each(
    _.sortBy(
        _.toArray(grouped), function (num) {
            return num;
        }
    ).reverse(),
    function (v) {
        console.log(v);
    }
);

由于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>

旧答案:

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
    });