迭代从_.groupBy检索的对象

时间:2015-09-06 21:27:49

标签: javascript underscore.js

使用下划线函数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);
} );

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

2 个答案:

答案 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;
&#13;
&#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
    });