如何在js中对嵌套的对象数组进行分组
How to group nested array of objects in js
我有一个嵌套的对象数组。我正在尝试对具有相同值的产品对象进行分组。
每个对象都有一个包含电子邮件的 vendor
属性。我正在尝试通过匹配 vendor email
来对对象进行分组
这是我的数据库的样子:
[
{
_id: "622d70a49bd88b1599026318",
products: [
{
_id: "6223186e2278d4e502f5264a",
title: "Product number 1",
price: 600,
cartQuantity: 1,
vendor: {email: "vendor1@gmail.com"}
},
{
_id: "622d4e9f9bd88b1599026317",
title: "asdas",
price: 100,
cartQuantity: 5,
vendor: {
email: "vendor2@gmail.com"
}
},
{
_id: "622d4e9f9bd88b1599026317",
title: "asdas",
price: 100,
cartQuantity: 5,
vendor: {
email: "vendor2@gmail.com"
}
}
]
}]
我正在尝试使用 reduce 方法,但问题是在 reduce
中使用 map
。它多次重复该对象。我也无法获取分组对象。
const groupedMap = db.reduce(
(entryMap, e) => e.products.map((product) => entryMap.set(product.vendor.email, [...entryMap.get(product)||[], product])),
new Map()
);
以上代码输出为:
我的期望是:
[0: {"vendor1@gmail.com" => Array(1)}
key: "vendor1@gmail.com"
value: [{_id: '6223186e2278d4e502f5264a', title: 'Product number 1', price: 600, cartQuantity: 1, vendor: {email: "vendor1@gmail.com"}}],
1: {"vendor2@gmail.com" => Array(2)}
key: "vendor2@gmail.com"
value: [{_id: '6223186e2278d4e502f5264a', title: 'Product number 1', price: 600, cartQuantity: 1, vendor: {email: "vendor2@gmail.com"}},
{_id: '6223186e2278d4e502f5264a', title: 'Product number 1', price: 600, cartQuantity: 1, vendor: {email:"vendor2@gmail.com"}}
]
]
尝试创建一个对象,其中键是您分组所依据的值。下一步是 foreach ,你检查数组中的每个对象,你要查找的值是否在创建的对象中 - 如果不是,那么你按搜索值过滤数组并将结果添加到你的对象
遍历数组中的每个项目,查看供应商电子邮件是否作为字典中的键存在,如果存在则将其推送到该数组,否则将供应商电子邮件键的值设置为一个数组其中的当前项目
见下方代码
const data = [{
_id: "622d70a49bd88b1599026318",
products: [{
_id: "6223186e2278d4e502f5264a",
title: "Product number 1",
price: 600,
cartQuantity: 1,
vendor: {
email: "vendor1@gmail.com"
}
},
{
_id: "622d4e9f9bd88b1599026317",
title: "asdas",
price: 100,
cartQuantity: 5,
vendor: {
email: "vendor2@gmail.com"
}
},
{
_id: "622d4e9f9bd88b1599026317",
title: "asdas",
price: 100,
cartQuantity: 5,
vendor: {
email: "vendor2@gmail.com"
}
}
]
}];
const mapped = {};
data[0].products.forEach(item => {
if (item.vendor.email in mapped) return mapped[item.vendor.email].push(item);
mapped[item.vendor.email] = [item];
});
const expectedFormat = Object.keys(mapped).map(key => {
const o = {};
o[key] = mapped[key];
return o;
});
console.log(expectedFormat)
我有一个嵌套的对象数组。我正在尝试对具有相同值的产品对象进行分组。
每个对象都有一个包含电子邮件的 vendor
属性。我正在尝试通过匹配 vendor email
这是我的数据库的样子:
[
{
_id: "622d70a49bd88b1599026318",
products: [
{
_id: "6223186e2278d4e502f5264a",
title: "Product number 1",
price: 600,
cartQuantity: 1,
vendor: {email: "vendor1@gmail.com"}
},
{
_id: "622d4e9f9bd88b1599026317",
title: "asdas",
price: 100,
cartQuantity: 5,
vendor: {
email: "vendor2@gmail.com"
}
},
{
_id: "622d4e9f9bd88b1599026317",
title: "asdas",
price: 100,
cartQuantity: 5,
vendor: {
email: "vendor2@gmail.com"
}
}
]
}]
我正在尝试使用 reduce 方法,但问题是在 reduce
中使用 map
。它多次重复该对象。我也无法获取分组对象。
const groupedMap = db.reduce(
(entryMap, e) => e.products.map((product) => entryMap.set(product.vendor.email, [...entryMap.get(product)||[], product])),
new Map()
);
以上代码输出为:
我的期望是:
[0: {"vendor1@gmail.com" => Array(1)}
key: "vendor1@gmail.com"
value: [{_id: '6223186e2278d4e502f5264a', title: 'Product number 1', price: 600, cartQuantity: 1, vendor: {email: "vendor1@gmail.com"}}],
1: {"vendor2@gmail.com" => Array(2)}
key: "vendor2@gmail.com"
value: [{_id: '6223186e2278d4e502f5264a', title: 'Product number 1', price: 600, cartQuantity: 1, vendor: {email: "vendor2@gmail.com"}},
{_id: '6223186e2278d4e502f5264a', title: 'Product number 1', price: 600, cartQuantity: 1, vendor: {email:"vendor2@gmail.com"}}
]
]
尝试创建一个对象,其中键是您分组所依据的值。下一步是 foreach ,你检查数组中的每个对象,你要查找的值是否在创建的对象中 - 如果不是,那么你按搜索值过滤数组并将结果添加到你的对象
遍历数组中的每个项目,查看供应商电子邮件是否作为字典中的键存在,如果存在则将其推送到该数组,否则将供应商电子邮件键的值设置为一个数组其中的当前项目
见下方代码
const data = [{
_id: "622d70a49bd88b1599026318",
products: [{
_id: "6223186e2278d4e502f5264a",
title: "Product number 1",
price: 600,
cartQuantity: 1,
vendor: {
email: "vendor1@gmail.com"
}
},
{
_id: "622d4e9f9bd88b1599026317",
title: "asdas",
price: 100,
cartQuantity: 5,
vendor: {
email: "vendor2@gmail.com"
}
},
{
_id: "622d4e9f9bd88b1599026317",
title: "asdas",
price: 100,
cartQuantity: 5,
vendor: {
email: "vendor2@gmail.com"
}
}
]
}];
const mapped = {};
data[0].products.forEach(item => {
if (item.vendor.email in mapped) return mapped[item.vendor.email].push(item);
mapped[item.vendor.email] = [item];
});
const expectedFormat = Object.keys(mapped).map(key => {
const o = {};
o[key] = mapped[key];
return o;
});
console.log(expectedFormat)