按子文档值分组对象-调整Array.reduce方法(元编程?)



关于如何使用reduce进行分组,我找到了一个明确的答案。

在对象阵列上分组的最有效方法

const array = [ 
{ _id:" 5fbcca92c36b24d99395623d",
assetData:
{ _id: "5fbcca159ae5f2d8ed792542",
name: 'House 1',
numberOfRooms: '1',
numberOfBathrooms: '2' } },
{ _id: "5fbcca92c36b24d99395623c",
assetData:
{ _id: "5fbcca159ae5f2d8ed792542",
name: 'House 1',
numberOfRooms: '1',
numberOfBathrooms: '2' } },
{ _id: "5fbccb32c36b24d993956242",
assetData:
{ _id: "5fbbedcb4decb58513e4ba80",
name: 'House 2',
numberOfRooms: '1',
numberOfBathrooms: '1' } },
{ _id: "5fbccb32c36b24d993956243",
assetData:
{ _id: "5fbbedcb4decb58513e4ba80",
name: 'House 2',
numberOfRooms: '1',
numberOfBathrooms: '1' } },
];

const groupBy = function (xs, key) {
return xs.reduce(function (rv, x) {
(rv[x[key]] = rv[x[key]] || []).push(x);
return rv;
}, {});
};

const test = Object.entries(groupBy(array, "_id"));

console.log(test);

我正在努力适应,而不是按_id排序,而是按assetData._id排序。更改groupBy函数上的key参数,而不是输出的行为。它不接受子文档的值。我甚至不知道如何继续我的研究,因为我真的不明白(rv[x[key]] = rv[x[key]] || [])函数的这一部分是什么意思。我开始在ES6中阅读一些关于元编程的内容,但我不确定它是否会给我带来答案。有小费吗?

好吧,由于我还没有理论上的回应,我试图用实际的方式解决这个问题。我似乎无法将字符串assetData._id直接传递到key参数中。也许以后会有人突然说出原因。目前,为了获得我预期的结果,我将密钥分为密钥和subkey,并传递与_id分离的assetData。最后的代码是:

const array = [ 
{ _id:" 5fbcca92c36b24d99395623d",
assetData:
{ _id: "5fbcca159ae5f2d8ed792542",
name: 'House 1',
numberOfRooms: '1',
numberOfBathrooms: '2' } },
{ _id: "5fbcca92c36b24d99395623c",
assetData:
{ _id: "5fbcca159ae5f2d8ed792542",
name: 'House 1',
numberOfRooms: '1',
numberOfBathrooms: '2' } },
{ _id: "5fbccb32c36b24d993956242",
assetData:
{ _id: "5fbbedcb4decb58513e4ba80",
name: 'House 2',
numberOfRooms: '1',
numberOfBathrooms: '1' } },
{ _id: "5fbccb32c36b24d993956243",
assetData:
{ _id: "5fbbedcb4decb58513e4ba80",
name: 'House 2',
numberOfRooms: '1',
numberOfBathrooms: '1' } },
];

const groupBy = function (xs, key, subkey) {
return xs.reduce(function (rv, x) {
(rv[x[key][subkey]] = rv[x[key][subkey]] || []).push(x);
return rv;
}, {});
};
const test = Object.entries(groupBy(array, "assetData", "_id"))
console.log(test)

我愿意接受更开明的答案!

最新更新