首页 > 解决方案 > 需要删除对象数组中的重复项并使用 union USING JS 合并数组

问题描述

需要删除对象数组中的重复项并将数组与 union USING JS 合并。试图过滤数组只是想array["INTERFACE"]APP_ID. 并删除重复记录。

未过滤的未合并数组

  var data =  [
    {
        "APP_ID" : "1001",
        "INTERFACE" : [
            {
                "INTERFACE_ID" : "01",
                "NAME" : "CIF OPENNING",
                "URL" : "/CusIdInfo",
                "STATUS" : "A"
            },
            {
                "INTERFACE_ID" : "07",
                "NAME" : "DASHBOARD",
                "URL" : "/Dashboard",
                "STATUS" : "A"
            },
            {
                "INTERFACE_ID" : "06",
                "NAME" : "SUMMARY COPC",
                "URL" : "/SummaryCopc",
                "STATUS" : "A"
            }
        ]
    },
    {
        "APP_ID" : "1002",
        "INTERFACE" : [
            {
                "INTERFACE_ID" : "07",
                "NAME" : "DASHBOARD",
                "URL" : "/Dashboard",
                "STATUS" : "A"
            },
            {
                "INTERFACE_ID" : "08",
                "NAME" : "BIOMETRIC",
                "URL" : "/Biometric",
                "STATUS" : "A"
            }
        ]
    },
    {
        "APP_ID" : "1001",
        "INTERFACE" : [
            {
                "INTERFACE_ID" : "01",
                "NAME" : "CIF OPENNING",
                "URL" : "/CusIdInfo",
                "STATUS" : "A"
            },
            {
                "INTERFACE_ID" : "05",
                "NAME" : "SUMMARY",
                "URL" : "/Summary",
                "STATUS" : "A"
            },
            {
                "INTERFACE_ID" : "06",
                "NAME" : "SUMMARY COPC 2",
                "URL" : "/SummaryCopc2",
                "STATUS" : "A"
            },
            {
                "INTERFACE_ID" : "07",
                "NAME" : "DASHBOARD 2",
                "URL" : "/Dashboard 2",
                "STATUS" : "A"
            }
        ]
    },
    {
        "APP_ID" : "1002",
        "INTERFACE" : [
            {
                "INTERFACE_ID" : "07",
                "NAME" : "DASHBOARD",
                "URL" : "/Dashboard",
                "STATUS" : "A"
            },
            {
                "INTERFACE_ID" : "08",
                "NAME" : "BIOMETRIC",
                "URL" : "/Biometric",
                "STATUS" : "A"
            }
        ]
    }
];

想要的结果

[
{
    "APP_ID" : "1002",
    "INTERFACE" : [
        {
            "INTERFACE_ID" : "07",
            "NAME" : "DASHBOARD",
            "URL" : "/Dashboard",
            "STATUS" : "A"
        },
        {
            "INTERFACE_ID" : "08",
            "NAME" : "BIOMETRIC",
            "URL" : "/Biometric",
            "STATUS" : "A"
        }
    ]
},
{
    "APP_ID" : "1001",
    "INTERFACE" : [
        {
            "INTERFACE_ID" : "01",
            "NAME" : "CIF OPENNING",
            "URL" : "/CusIdInfo",
            "STATUS" : "A"
        },
        {
            "INTERFACE_ID" : "05",
            "NAME" : "SUMMARY",
            "URL" : "/Summary",
            "STATUS" : "A"
        },
        {
            "INTERFACE_ID" : "06",
            "NAME" : "SUMMARY COPC",
            "URL" : "/SummaryCopc",
            "STATUS" : "A"
        },
        {
            "INTERFACE_ID" : "07",
            "NAME" : "DASHBOARD",
            "URL" : "/Dashboard",
            "STATUS" : "A"
        },            {
            "INTERFACE_ID" : "07",
            "NAME" : "DASHBOARD 2",
            "URL" : "/Dashboard2",
            "STATUS" : "A"
        },
        {
            "INTERFACE_ID" : "06",
            "NAME" : "SUMMARY COPC 2",
            "URL" : "/SummaryCopc2",
            "STATUS" : "A"
        }
    ]
}
]

试图过滤数组只是想array["INTERFACE"]APP_ID. 并删除重复记录。

标签: javascript

解决方案


这是一个稍微有弹性的解决方案,它依赖于允许动态聚合的函数生成器。

以下示例遵循的逻辑是,在您的数据输入中,主要对象的唯一键是APP_ID. 接下来,每个 APP_ID 的聚合规则是它应该遵循另一个聚合规则INTERFACE。事实上,每个界面都有一个独特的NAME,解释了为什么您的结果样本中有多个“07”和“06”。

代码解释记录在代码本身中。

var data =  [
    {
        "APP_ID" : "1001",
        "INTERFACE" : [
            {
                "INTERFACE_ID" : "01",
                "NAME" : "CIF OPENNING",
                "URL" : "/CusIdInfo",
                "STATUS" : "A"
            },
            {
                "INTERFACE_ID" : "07",
                "NAME" : "DASHBOARD",
                "URL" : "/Dashboard",
                "STATUS" : "A"
            },
            {
                "INTERFACE_ID" : "06",
                "NAME" : "SUMMARY COPC",
                "URL" : "/SummaryCopc",
                "STATUS" : "A"
            }
        ]
    },
    {
        "APP_ID" : "1002",
        "INTERFACE" : [
            {
                "INTERFACE_ID" : "07",
                "NAME" : "DASHBOARD",
                "URL" : "/Dashboard",
                "STATUS" : "A"
            },
            {
                "INTERFACE_ID" : "08",
                "NAME" : "BIOMETRIC",
                "URL" : "/Biometric",
                "STATUS" : "A"
            }
        ]
    },
    {
        "APP_ID" : "1001",
        "INTERFACE" : [
            {
                "INTERFACE_ID" : "01",
                "NAME" : "CIF OPENNING",
                "URL" : "/CusIdInfo",
                "STATUS" : "A"
            },
            {
                "INTERFACE_ID" : "05",
                "NAME" : "SUMMARY",
                "URL" : "/Summary",
                "STATUS" : "A"
            },
            {
                "INTERFACE_ID" : "06",
                "NAME" : "SUMMARY COPC 2",
                "URL" : "/SummaryCopc2",
                "STATUS" : "A"
            },
            {
                "INTERFACE_ID" : "07",
                "NAME" : "DASHBOARD 2",
                "URL" : "/Dashboard 2",
                "STATUS" : "A"
            }
        ]
    },
    {
        "APP_ID" : "1002",
        "INTERFACE" : [
            {
                "INTERFACE_ID" : "07",
                "NAME" : "DASHBOARD",
                "URL" : "/Dashboard",
                "STATUS" : "A"
            },
            {
                "INTERFACE_ID" : "08",
                "NAME" : "BIOMETRIC",
                "URL" : "/Biometric",
                "STATUS" : "A"
            }
        ]
    }
];

// Aggregate duplicates with a common uniqueKey, invoking the aggregateExpression callback for each pair.
function* aggregateDuplicates(arr, uniqueKey, aggregateExpression) {
  const aggregateGroups = arr.reduce((acc,next) => {
    acc[next[uniqueKey]] = acc[next[uniqueKey]] || []; 
    return acc[next[uniqueKey]].push(next), acc;
  }, {});
  // loop items.
  for (var [_, entries] of Object.entries(aggregateGroups)) {
    // Aggregate results following the aggregateExpression.
    yield Object.assign({}, entries.reduce((acc, next) => aggregateExpression(acc, next)));
  }
}

// Aggregate duplicates of data, whose unique key is APP_ID.
const res = [...aggregateDuplicates(data, 'APP_ID', (a,b) => {
  // In order to properly aggregate the INTERFACE property, acquire the set of entires interfaces of two items with the same APP_ID.
  var interfacesSet = [...a.INTERFACE, ...b.INTERFACE];
  // Finally, spread common values between them, then aggregate the INTERFACE property by its unique NAME key.
  return Object.assign(a, b, {
    INTERFACE: [...aggregateDuplicates(interfacesSet, 'NAME', (c,d) => {
      // For that NAME property, just assign the values of both objects, nothing more nothing less.
      return Object.assign(c,d)
    })]
  });
})];
console.log(res);

旁注:INTERFACE未应用对属性的排序,这是一个优点,但我认为只要输出数据有效正确,它就不是强制性的。


推荐阅读