我想从要排序的字典数组中返回一个由数组组成的新数组。我可能没有正确解释,但我仅举一些我想做的事的例子。
所以我有以下内容:
let foo = [{"id": "hello123"}, {"id":"goodbye123"}, {"id":"hello123"}];
我想按id值对其进行排序,并返回数组字典数组,如下所示:
let bar = sortByKey(foo, "id");
console.log(bar);
output = [[{"id":"hello123"},{"id":"hello123"}],[{"id":"goodbye123"}]]
到目前为止,我所知道的所有方法都是对它进行排序,以使结果看起来像这样:
[{"id":"hello123"},{"id":"hello123"},{"id":"goodbye123"}]
答案 0 :(得分:2)
您可以将哈希表用于组,并使用Array#reduce
来迭代数组,并将所有对象分配给它们的组。
稍后返回哈希表中的所有值。
function groupBy(array, group) {
return Object.values(array.reduce((hash, o) => {
hash[o[group]] = hash[o[group]] || [];
hash[o[group]].push(o);
return hash;
}, Object.create(null)));
}
var data = [{ id: "hello123" }, { id: "goodbye123" }, { id: "hello123" }];
console.log(groupBy(data, "id"));
.as-console-wrapper { max-height: 100% !important; top: 0; }
与Map
相同,但略短。
function groupBy(array, group) {
return Array.from(array
.reduce((m, o) => m.set(o[group], [...(m.get(o[group]) || []), o]), new Map)
.values()
);
}
var data = [{ id: "hello123" }, { id: "goodbye123" }, { id: "hello123" }];
console.log(groupBy(data, "id"));
.as-console-wrapper { max-height: 100% !important; top: 0; }
答案 1 :(得分:1)
仅是为了提供另一个解决方案(尽管@NinaScholz的解决方案更好),这是一个依赖于Set
,map
和filter
的解决方案:
let foo = [{"id": "hello123"}, {"id":"goodbye123"}, {"id":"hello123"}];
function sortByKey(arr, key) {
const _uniqueValues = [...new Set(foo.map(i => i[key]))].sort((a,b) => (a[key] > b[key]) ? 1 : ((b[key] > a[key]) ? -1 : 0));
return _uniqueValues.map(v => arr.filter(i => i[key] === v));
}
console.log(sortByKey(foo, 'id'));
这将首先采用唯一值(使用Set
)并对它们进行排序,然后通过使用filter
对原始数组进行分区来映射它们。
reduce
解决方案将更加高效,但这仍然是实现这一目标的一种可行方法。
请接受/阅读下面的@NinaScholz解决方案,这只是所提供解决方案的替代方案。使用reduce是正确的方法