【问题标题】:How to parse duplicate data in a list of objects based on multiple keys having the same value, where one key has a value of an array of objects如何基于具有相同值的多个键解析对象列表中的重复数据,其中一个键具有对象数组的值
【发布时间】:2022-01-20 20:59:39
【问题描述】:

正如标题所述,我正在尝试根据相同的特定键:值对存储重复对象的列表。

目标是解析信息并返回重复项列表。重复项目是当 ID 、标题、项目匹配时。 我遇到的主要问题是,在每个对象内部,要比较的键之一是一个数组,其中包含一个对象列表作为值。

你会如何解决这个问题,循环遍历一个对象数组以确定 items 数组是否重复?

以下只是 JSON 数据的一个小示例。

应该返回: pk:"0002" 和 pk"0003" 的整个对象,因为它们是重复的。不应返回 Object pk:"0001" 和 pk "0004",因为它们的项数组:[{}] 不相等。

我的尝试可以确定 ID 和标题是否匹配,但我无法获得匹配的项目:

var data = [
{ pk: "0001", ID: "1A", title: "Material 15", items: [{ title: "Info", value: "" }, { title: "Type", value: "" }, { title: "EXTRA", value: "55" }, ], }, 
{ pk: "0002", ID: "1A", title: "Material 1", items: [{ title: "Info", value: "" }, { title: "Type", value: "" }, ], }, 
{ pk: "0003", ID: "1A", title: "Material 1", items: [{ title: "Info", value: "" }, { title: "Type", value: "" }, ], }, 
{ pk: "0004", ID: "1A", title: "Material 15", items: [{ title: "Info", value: "" }, { title: "Type", value: "" }, ], }, 
];


let duplicates = [];
data.forEach((el, i) => {
  data.forEach((element, index) => {
    if (i === index) return null;
    if (element.ID === el.ID && element.title === el.title) {
      if (!duplicates.includes(el)) {
        //Issue here -> I want to compare the array of items but im not sure how to ?
        //Attempt:
        // I think I understand that this is wrong due to the indexes not sure how you would find this ?

        // if (element.items[i] === el.items[i]) {
        //   duplicates.push(el);
        //   console.log("Test");
        // }

        duplicates.push(el);
      }
    }
  });
});
console.log("duplicates", duplicates);

【问题讨论】:

  • 你有排序的项目吗?
  • 是的,它们是按顺序排序的,抱歉忘记提了

标签: javascript arrays json duplicates javascript-objects


【解决方案1】:

您可以计算具有相同字符串值的项目并将其对象作为结果。

const
    data = [{ pk: "0001", ID: "1A", title: "Material 15", items: [{ title: "Info", value: "" }, { title: "Type", value: "" }, { title: "EXTRA", value: "55" }] }, { pk: "0002", ID: "1A", title: "Material 1", items: [{ title: "Info", value: "" }, { title: "Type", value: "" }] }, { pk: "0003", ID: "1A", title: "Material 1", items: [{ title: "Info", value: "" }, { title: "Type", value: "" }] }, { pk: "0004", ID: "1A", title: "Material 15", items: [{ title: "Info", value: "" }, { title: "Type", value: "" }] }],
    keys = ['ID', 'title', 'items'],
    map = data.reduce((m, o) => {
        const
            key = keys.map(k => JSON.stringify(o[k])).join('|'),
            [count = 0, array = []] = m.get(key) || [];
        return m.set(key, [count + 1, [...array, o]]);
    }, new Map),
    duplicates = Array
        .from(map.values(), ([count, array]) => count === 1 ? []: array)
        .flat();

console.log(duplicates);
.as-console-wrapper { max-height: 100% !important; top: 0; }

【讨论】:

    猜你喜欢
    • 2018-12-30
    • 2021-10-26
    • 1970-01-01
    • 1970-01-01
    • 2022-11-18
    • 1970-01-01
    • 1970-01-01
    • 2021-01-21
    • 2018-12-07
    相关资源
    最近更新 更多