Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将冗余对象分组到数组中_Javascript_Group By - Fatal编程技术网

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(
|
)。