Javascript 将冗余对象分组到数组中
我有一张卡片清单:Javascript 将冗余对象分组到数组中,javascript,group-by,Javascript,Group By,我有一张卡片清单: "Cards": [ { "BIN": "308103", "TIER": { "Nums": "1", "Phone": "111111111 *", } },
"Cards": [
{
"BIN": "308103",
"TIER": {
"Nums": "1",
"Phone": "111111111 *",
}
},
{
"BIN": "308103",
"TIER": {
"Nums": "2",
"Phone": "0000000000",
}
},
{
"BIN": "308516",
"TIER": {
"Nums": "",
"Phone": "00000000 *",
}
},
]
我需要做的是将所有具有相似的BIN的卡合并到列表中第一个对象的属性层中
请求的输出是:
"Cards": [
{
"BIN": "308103",
"TIER": [
{
"Nums": "1",
"Phone": "111111111 *",
},
{
"Nums": "2",
"Phone": "0000000000",
}
],
},
{...}
我使用组合循环实现了这一点,但我需要一个性能友好的解决方案。您可以按
BIN
对每个项目进行分组,通过将它们分配到BIN键,然后访问映射的值来减少它们
const数据={
“卡片”:[
{“BIN”:“308103”,“TIER”:{“Nums”:“1”,“Phone”:“111111111*”},
{“BIN”:“308103”,“TIER”:{“Nums”:“2”,“Phone”:“0000000000”},
{“BIN”:“308516”,“TIER”:{“Nums”:“Phone”:“00000000*”}
]
};
常量groupedByBin={
Cards:Object.values(data.Cards.reduce((acc,{BIN,TIER:{Nums,Phone})=>
({…acc[BIN]:{BIN,TIER:[…(acc[BIN]?.TIER???[]),{Nums,Phone}}}),{});
console.log(groupedByBin)代码>
.as控制台包装{top:0;最大高度:100%!important;}
假设cardsArray
是您的原始数组
const binMap = {};
cardsArray.forEach(card => {
if(binMap[card.BIN])
binMap[card.BIN].TIER.push(card.TIER);
else
binMap[card.BIN] = {
BIN: card.BIN
TIER: [ card.TIER ]
};
});
const finalArray = Object.values(binMap);
最终光线是所需的输出
注意:并非所有浏览器都接受Object.values,因此如果它不起作用,您可以执行一些其他步骤:
const finalArray = [];
Object.keys(binMap).forEach(bin => finalArray.push(binMap[bin]));
我们对相似的定义是什么?这对于配置和逻辑很重要如果你有工作代码,并且你想要更高效的东西,那么这不是一个合适的地方,你可能会选择on-Stackoverflow在这里帮助你解决代码问题,所以如果你有代码,你试图编写代码来完成你描述的任务,但它不起作用,你会想反映这一点。尽管考虑到您的要求,我还是强烈建议您先搜索SO,因为您不是第一个需要在数组中重新映射对象的人,而且SO上肯定已经有了这个问题的答案。组合循环对性能非常友好,为什么不给我们看一下。我得到了一个“意外标记”。这里:(acc[BIN]?.TIER???[])@AbdallahJg如果您的浏览器不支持空合并运算符(??
),请将其替换为逻辑or(|
)。