迭代从 _.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
});
使用下划线函数 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
});