按字典值排序后,如何返回字典数组的新数组

时间:2019-04-30 08:42:59

标签: javascript arrays sorting dictionary

我想从要排序的字典数组中返回一个由数组组成的新数组。我可能没有正确解释,但我仅举一些我想做的事的例子。

所以我有以下内容:

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"}]

2 个答案:

答案 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的解决方案更好),这是一个依赖于Setmapfilter的解决方案:

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是正确的方法