gpt4 book ai didi

javascript - 按属性对数组中的对象进行分组

转载 作者:行者123 更新时间:2023-12-03 08:45:19 24 4
gpt4 key购买 nike

我刚刚开始认真学习编码。 :)我遇到了一个对我来说似乎太复杂的问题。

如何按促销类型对以下产品进行分组?

var data = [
{
name:'product1',
price:'40',
promotion:[
{
name:'Buy 3 get 30% off',
code:'ewq123'
},
{
name:'Free Gift',
code:'abc140'
}
]
},
{
name:'product2',
price:'40',
promotion:[
{
name:'Buy 3 get 30% off',
code:'ewq123'
}
]
},
{
name:'product3',
price:'40',
promotion:[
{
name:'Buy 3 get 30% off',
code:'ewq123'
}
]
},
{
name:'product4',
price:'40'
},
{
name:'product5',
price:'40',
promotion:[
{name:'30% off', code:'fnj245'}
]
},
{
name:'product6',
price:'0',
promotion:[
{
name:'Free Gift',
code:'abc140'
}
]
}
];

我想得到以下格式的结果

result =[
{
name : 'Buy 3 get 30% off',
code: 'ewq123',
products: [
... array of products
]
},
{
name : '30% off',
code: 'fnj245',
products: [
... array of products
]
},
{
...
}
];

我可以通过促销代码获取产品列表,但如何使其通用?

function productHasPromo(product, promotion){
if(!product.hasOwnProperty('promotion')) return false;

var productPromo = product.promotion;

for(var i=0; i<productPromo.length; i++){
if(productPromo[i].code === promotion){
return true;
}
}

return false;
}

function groupProductByPromo(products, promotion){
var arr = [];

for(var i=0; i<products.length; i++){
if(productHasPromo(products[i], promotion)){
arr.push(products[i]);
}
}

return arr;
}

最佳答案

说明

您可以编写一个函数来循环遍历数组并在指定属性中搜索唯一值。当使用简单的数据类型时,这很容易完成,但可以使用辅助分组函数将更复杂的结构作为对象数组(如您的示例中所示)来完成。

由于您还需要在分组后以特定格式输出,因此我们还必须使用转换器。该转换器将接收原始数据和分组函数提取的唯一值,并生成所需的输出。

示例中使用了以下函数:

Array.prototype.groupBy = function (property, grouping, transformer) {

var values = [];

this.forEach(function (item) {

grouping.call(this, item, property).forEach(function (item) {

if (!values.contains(property, item[property])) {
values.push(item);
}

});

});

return transformer.call(this, values);

};

Array.prototype.contains = function (key, value) {
return this.find(function (elm) {
return elm[key] === value;
});
};

function transformerFunction(values) {

this.forEach(function (item) {

if (!item.promotion) return;

item.promotion.forEach(function (promotion) {

values.forEach(function (option) {

if (option.code === promotion.code) {
if (option.products) {
option.products.push(item);
} else {
option.products = [item];
}
}

});

});

});

return values;

}

function groupingFunction(item, property) {

if (!item.promotion) return [];

var values = [];

item.promotion.forEach(function (promotion) {

if (!values.contains(property, promotion[property])) {
values.push(promotion);
}

});

return values;

}

使用方法如下:

var items = data.groupBy('code', groupFunction, transformFunction);

示例

检查我在jsfiddle准备的示例

关于javascript - 按属性对数组中的对象进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32916972/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com