如何按数组对象分组并使用值键javascript创建数组

如何按数组对象分组并使用值键javascript创建数组,javascript,node.js,adonis.js,Javascript,Node.js,Adonis.js,如何根据值按数组对象分组以创建新的值数组对象 输入 var promotions = [ { "promotionID": 2, "id": 1, "qty": 1, "productID": 1, "product": "Nu Milk Tea 330ml", "

如何根据值按数组对象分组以创建新的值数组对象

输入

var promotions = [
    {
        "promotionID": 2,
        "id": 1,
        "qty": 1,
        "productID": 1,
        "product": "Nu Milk Tea 330ml",
        "operator": null
    }, {
        "promotionID": 2,
        "id": 2,
        "qty": 2,
        "productID": 2,
        "product": "Product testing 2",
        "operator": 1
    }, {
        "promotionID": 2,
        "id": 3,
        "qty": 3,
        "productID": 3,
        "product": "Golda Coffee Dolce Latte 200ml",
        "operator": 2
    }, {
        "promotionID": 3,
        "id": 4,
        "qty": 8,
        "productID": 54,
        "product": "Masker Skrineer 3ply Motif 5pcs",
        "operator": null
    }, {
        "promotionID": 3,
        "id": 5,
        "qty": 5,
        "productID": 53,
        "product": "Masker Skrineer 1ply Grey 5pcs",
        "operator": 2
    }, {
        "promotionID": 3,
        "id": 6,
        "qty": 5,
        "productID": 52,
        "product": "Oronamin C Drink 120ml",
        "operator": 1
    }]
[
    {
        "promotionID": 2,
        "data" : [
            {
                "promotionID": 2,
                "id": 1,
                "qty": 1,
                "productID": 1,
                "product": "Nu Milk Tea 330ml",
                "operator": null
            }, {
                "promotionID": 2,
                "id": 2,
                "qty": 2,
                "productID": 2,
                "product": "Product testing 2",
                "operator": 1
            }, {
                "promotionID": 2,
                "id": 3,
                "qty": 3,
                "productID": 3,
                "product": "Golda Coffee Dolce Latte 200ml",
                "operator": 2
            } 
        ]
    },
    {
        "promotionID": 3,
        "data" : [
            {
                "promotionID": 3,
                "id": 4,
                "qty": 8,
                "productID": 54,
                "product": "Masker Skrineer 3ply Motif 5pcs",
                "operator": null
            }, {
                "promotionID": 3,
                "id": 5,
                "qty": 5,
                "productID": 53,
                "product": "Masker Skrineer 1ply Grey 5pcs",
                "operator": 2
            }, {
                "promotionID": 3,
                "id": 6,
                "qty": 5,
                "productID": 52,
                "product": "Oronamin C Drink 120ml",
                "operator": 1
            }
        ]
    }
 
]
我想创建一个按
promotionID

预期产出

var promotions = [
    {
        "promotionID": 2,
        "id": 1,
        "qty": 1,
        "productID": 1,
        "product": "Nu Milk Tea 330ml",
        "operator": null
    }, {
        "promotionID": 2,
        "id": 2,
        "qty": 2,
        "productID": 2,
        "product": "Product testing 2",
        "operator": 1
    }, {
        "promotionID": 2,
        "id": 3,
        "qty": 3,
        "productID": 3,
        "product": "Golda Coffee Dolce Latte 200ml",
        "operator": 2
    }, {
        "promotionID": 3,
        "id": 4,
        "qty": 8,
        "productID": 54,
        "product": "Masker Skrineer 3ply Motif 5pcs",
        "operator": null
    }, {
        "promotionID": 3,
        "id": 5,
        "qty": 5,
        "productID": 53,
        "product": "Masker Skrineer 1ply Grey 5pcs",
        "operator": 2
    }, {
        "promotionID": 3,
        "id": 6,
        "qty": 5,
        "productID": 52,
        "product": "Oronamin C Drink 120ml",
        "operator": 1
    }]
[
    {
        "promotionID": 2,
        "data" : [
            {
                "promotionID": 2,
                "id": 1,
                "qty": 1,
                "productID": 1,
                "product": "Nu Milk Tea 330ml",
                "operator": null
            }, {
                "promotionID": 2,
                "id": 2,
                "qty": 2,
                "productID": 2,
                "product": "Product testing 2",
                "operator": 1
            }, {
                "promotionID": 2,
                "id": 3,
                "qty": 3,
                "productID": 3,
                "product": "Golda Coffee Dolce Latte 200ml",
                "operator": 2
            } 
        ]
    },
    {
        "promotionID": 3,
        "data" : [
            {
                "promotionID": 3,
                "id": 4,
                "qty": 8,
                "productID": 54,
                "product": "Masker Skrineer 3ply Motif 5pcs",
                "operator": null
            }, {
                "promotionID": 3,
                "id": 5,
                "qty": 5,
                "productID": 53,
                "product": "Masker Skrineer 1ply Grey 5pcs",
                "operator": 2
            }, {
                "promotionID": 3,
                "id": 6,
                "qty": 5,
                "productID": 52,
                "product": "Oronamin C Drink 120ml",
                "operator": 1
            }
        ]
    }
 
]

您可以使用
reduce
按promotionId对促销进行分组,然后映射条目以获得最终结果

var促销=[
{
推广类别:二,,
id:1,
数量:1,
产品编号:1,
产品:“Nu奶茶330ml”,
操作员:空
},
{
推广类别:二,,
id:2,
数量:2,
产品编号:2,
产品:“产品测试2”,
接线员:1
},
{
推广类别:二,,
id:3,
数量:3,
产品编号:3,
产品:“Golda Coffee Dolce Latte 200毫升”,
接线员:2
},
{
推广编号:3,,
id:4,
数量:8,
产品编号:54,
产品:“面具Skrineer 3ply图案5pcs”,
操作员:空
},
{
推广编号:3,,
id:5,
数量:5,
产品编号:53,,
产品:“遮罩Skrineer 1件灰色5件”,
接线员:2
},
{
推广编号:3,,
id:6,
数量:5,
产品编号:52,,
产品:“奥罗那明C饮料120ml”,
接线员:1
}
]
const res=Array.from(
促销
.减少((acc,促销)=>{
附件组(
promotion.promotionID,
(acc.get(promotion.promotionID)| |[])concat(promotion)
)
返回acc
},新地图)
.entries(),
([promotionId,data])=>({promotionId,data})
)
console.log(res)
这是我的答案

var促销=[
{
推广类别:二,,
id:1,
数量:1,
产品编号:1,
产品:“Nu奶茶330ml”,
运算符:空,
},
{
推广类别:二,,
id:2,
数量:2,
产品编号:2,
产品:“产品测试2”,
接线员:1,,
},
{
推广类别:二,,
id:3,
数量:3,
产品编号:3,
产品:“Golda Coffee Dolce Latte 200毫升”,
接线员:2,,
},
{
推广编号:3,,
id:4,
数量:8,
产品编号:54,
产品:“面具Skrineer 3ply图案5pcs”,
运算符:空,
},
{
推广编号:3,,
id:5,
数量:5,
产品编号:53,,
产品:“遮罩Skrineer 1件浅灰色5件”,
接线员:2,,
},
{
推广编号:3,,
id:6,
数量:5,
产品编号:52,,
产品:“奥罗那明C饮料120ml”,
接线员:1,,
},
];
const objectPromotion={};
对于(促销中的索引){
const dataPromotion=objectPromotion[promotions[index].promotionID];
log(“dataPromotion”,dataPromotion)
if(数据促销){
dataPromotion.push(促销[索引]);
}否则{
objectPromotion[promotions[index].promotionID]=[promotions[index]];
}
}
const result=Object.keys(objectPromotion.map)(项目)=>{
返回{
促销ID:项目,
数据:objectPromotion[项目],
};
});

log(“result”,result)
您应该像这样使用lodash

const _ = require('lodash');
let filteredPromotions=_.groupBy(promotions,'promotionID');
输出:

{
  '2': [
    {
      promotionID: 2,
      id: 1,
      qty: 1,
      productID: 1,
      product: 'Nu Milk Tea 330ml',
      operator: null
    },
    {
      promotionID: 2,
      id: 2,
      qty: 2,
      productID: 2,
      product: 'Product testing 2',
      operator: 1
    },
    {
      promotionID: 2,
      id: 3,
      qty: 3,
      productID: 3,
      product: 'Golda Coffee Dolce Latte 200ml',
      operator: 2
    }
  ],
  '3': [
    {
      promotionID: 3,
      id: 4,
      qty: 8,
      productID: 54,
      product: 'Masker Skrineer 3ply Motif 5pcs',
      operator: null
    },
    {
      promotionID: 3,
      id: 5,
      qty: 5,
      productID: 53,
      product: 'Masker Skrineer 1ply Grey 5pcs',
      operator: 2
    },
    {
      promotionID: 3,
      id: 6,
      qty: 5,
      productID: 52,
      product: 'Oronamin C Drink 120ml',
      operator: 1
    }
  ]
}
[
    {
        "promotionID": 2,
        "data" : [
            {
                "promotionID": 2,
                "id": 1,
                "qty": 1,
                "productID": 1,
                "product": "Nu Milk Tea 330ml",
                "operator": null
            }, {
                "promotionID": 2,
                "id": 2,
                "qty": 2,
                "productID": 2,
                "product": "Product testing 2",
                "operator": 1
            }, {
                "promotionID": 2,
                "id": 3,
                "qty": 3,
                "productID": 3,
                "product": "Golda Coffee Dolce Latte 200ml",
                "operator": 2
            } 
        ]
    },
    {
        "promotionID": 3,
        "data" : [
            {
                "promotionID": 3,
                "id": 4,
                "qty": 8,
                "productID": 54,
                "product": "Masker Skrineer 3ply Motif 5pcs",
                "operator": null
            }, {
                "promotionID": 3,
                "id": 5,
                "qty": 5,
                "productID": 53,
                "product": "Masker Skrineer 1ply Grey 5pcs",
                "operator": 2
            }, {
                "promotionID": 3,
                "id": 6,
                "qty": 5,
                "productID": 52,
                "product": "Oronamin C Drink 120ml",
                "operator": 1
            }
        ]
    }
 
]
要获得准确的输出,请添加这些行:

    filteredPropomotions = Object.keys(filteredPropomotions).map((key, index)=> {return{promotionID:key,data:filteredPropomotions[key]}}
);
输出:

{
  '2': [
    {
      promotionID: 2,
      id: 1,
      qty: 1,
      productID: 1,
      product: 'Nu Milk Tea 330ml',
      operator: null
    },
    {
      promotionID: 2,
      id: 2,
      qty: 2,
      productID: 2,
      product: 'Product testing 2',
      operator: 1
    },
    {
      promotionID: 2,
      id: 3,
      qty: 3,
      productID: 3,
      product: 'Golda Coffee Dolce Latte 200ml',
      operator: 2
    }
  ],
  '3': [
    {
      promotionID: 3,
      id: 4,
      qty: 8,
      productID: 54,
      product: 'Masker Skrineer 3ply Motif 5pcs',
      operator: null
    },
    {
      promotionID: 3,
      id: 5,
      qty: 5,
      productID: 53,
      product: 'Masker Skrineer 1ply Grey 5pcs',
      operator: 2
    },
    {
      promotionID: 3,
      id: 6,
      qty: 5,
      productID: 52,
      product: 'Oronamin C Drink 120ml',
      operator: 1
    }
  ]
}
[
    {
        "promotionID": 2,
        "data" : [
            {
                "promotionID": 2,
                "id": 1,
                "qty": 1,
                "productID": 1,
                "product": "Nu Milk Tea 330ml",
                "operator": null
            }, {
                "promotionID": 2,
                "id": 2,
                "qty": 2,
                "productID": 2,
                "product": "Product testing 2",
                "operator": 1
            }, {
                "promotionID": 2,
                "id": 3,
                "qty": 3,
                "productID": 3,
                "product": "Golda Coffee Dolce Latte 200ml",
                "operator": 2
            } 
        ]
    },
    {
        "promotionID": 3,
        "data" : [
            {
                "promotionID": 3,
                "id": 4,
                "qty": 8,
                "productID": 54,
                "product": "Masker Skrineer 3ply Motif 5pcs",
                "operator": null
            }, {
                "promotionID": 3,
                "id": 5,
                "qty": 5,
                "productID": 53,
                "product": "Masker Skrineer 1ply Grey 5pcs",
                "operator": 2
            }, {
                "promotionID": 3,
                "id": 6,
                "qty": 5,
                "productID": 52,
                "product": "Oronamin C Drink 120ml",
                "operator": 1
            }
        ]
    }
 
]

我会使用for循环,或者甚至是array reduce方法,因为array.from接受第二个参数,一个map函数,你可以替换
).map(([promotionId,data])=>({promotionId,data}))
,([promotionId,data])=>({promotionId,data}))
(当你的答案出现时我就是这样写的)@JaromandaX cool,更新了我的答案。谢谢你的建议,你也可以只做
newmap
,而不是
newmap()
(我喜欢尽量减少代码:p@JaromandaX哈哈,不用担心,我喜欢这样。但是我想知道为什么没有括号它仍然有效。看…语法是
新构造函数[([arguments])]
…任何
[]中的东西
是可选的…javascript是这样编写的-我想在36k拨号的日子里,尽可能保存两个字符是很重要的:p