首页 > 解决方案 > 从json数组节点js获取非唯一记录

问题描述

我有一个要求,它将获得如下所示的 json 数组对象(输入) json 我需要获取重复记录和取消记录并将其加载到相应的列表中。检查数组是否有重复的条件 :: id

let uniqueList = [];
let dupList = [];

Array.prototype.contains = function (item) {
    let filtered_item = this.filter((i) => {
        return i.id === item.id
    });
    return !!filtered_item.length;
}

function contains(list, item) {
    let filtered_item = list.filter((i) => {
        return i.id === item.id
    });
    return !!filtered_item.length;
}

function pushToUniqueList(item) {
    uniqueList.push(item);
}

function pushToDuplicateList(item) {
    dupList.push(item);
}

for (let i = 0; i < objList.length; i++) {
    if (uniqueList.contains(objList[i])) {
        pushToDuplicateList(objList[i]);
    } else {
        pushToUniqueList(objList[i]);
    }
}
Input : [{"obj":{"id":"1234","table":"123"}},{"obj":{"id":"1234","table":"123"}},{"obj":{"id":"12344","table":"123"}}]
output : uniqueList =[{ "obj":{ "id":"12344", "table":"123" }]
dupList =[{"obj":{"id":"1234","table":"123"}},{"obj":{"id":"1234","table":"123"}}]

我已经尝试使用上面的代码,但它不工作请帮助!提前致谢!

标签: node.js

解决方案


你可以试试下面的,这段代码在线性时间内运行

const data = [
      { obj: { id: "1234", table: "123" } },
      { obj: { id: "1234", table: "123" } },
      { obj: { id: "12344", table: "123" } },
    ];
    
    const map = new Map();
    
    for (const entry of data) {
      if (map.has(entry.obj.id)) {
        map.get(entry.obj.id).push(entry);
      } else {
        map.set(entry.obj.id, [entry]);
      }
    }
    
    const uniques = [];
    const duplicates = [];
    
    for (const [id, values] of map.entries()) {
      if (values.length > 1) {
        duplicates.push(...values);
      } else {
        uniques.push(...values);
      }
    }
    
    console.log(`duplicates: ${JSON.stringify(duplicates)}`);
    console.log(`unique: ${JSON.stringify(uniques)}`);

输出

[
  { obj: { id: '1234', table: '123' } },
  { obj: { id: '1234', table: '123' } }
] [ { obj: { id: '12344', table: '123' } } ]

推荐阅读