javascript - 当通过同时查看 2 个或更多键来确定唯一性时,如何从对象数组中删除重复项

标签 javascript performance duplicates

我有一长串对象(>10_000),其中有我想要删除的重复对象。

为了找到重复项,我必须查看两个对象属性:a, b

这里有一些通过一个属性删除对象的优雅答案:JavaScript: Remove duplicates of objects sharing same property value

例如

const uniq = _.uniq(arr, ele => ele.value}); 

解决方案的输出如下所示:

const arr = [{a:1, b:1}, {a:1, b:1}, {a:2, b:2}];
const removeDuplcatesByTwoKeys = (arr, ['a', 'b']) => // only elements that are duplicates for both key values;
result: const arr = [{a:2, b:2}];

我尝试过 _.uniq(arr, ele => ele.value && ele.otherValue}); 但这不起作用。

另一种方法是创建由这些值作为键的现有值的映射例如

function unique(arr, keyProps) {
    let map = new Map();
    const kvArray = arr.map(entry => {
        return keyProps.map(k => entry[k]).join('|');
    })
    kvArray.map(kv => {
        if(map.has(kv)) {
            const val = map.get(kv)
            map.set(kv, val + 1)
        } else {
            map.set(kv, 1)
        }
    })
}

虽然这会告诉您重复项是什么,但是从原始数组中删除它们的最佳方法是什么?这感觉像是一个比实际需要更复杂的解决方案。

从对象数组中删除两个属性重复项的高效方法是什么?

最佳答案

您可以将 _.uniq 与两个属性一起用作 JSON 字符串。这样,每个元素都可以通过统一系统与其他元素进行比较。

例如,

const arr = [{a:1, b:1}, {a:1, b:1}, {a:2, b:2}];
const removeDuplcatesByTwoKeys = _.uniq(arr, el => JSON.stringify({a: el.a, b: el.b}));

console.log(removeDuplcatesByTwoKeys)
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.9.1/underscore-min.js"></script>

关于javascript - 当通过同时查看 2 个或更多键来确定唯一性时,如何从对象数组中删除重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51314685/

相关文章:

javascript - 点击图片后全屏div

javascript - 通过单击 JS 驱动的按钮创建 HTML 页面

javascript - 在 Backbone 中实现一个 memoize 风格的模块加载器

javascript - 扩展 HTMLOptionsCollection

mysql - 显示重复值子查询mysql

algorithm - 针对特定情况的最快排序算法

c++ - 基本 C++ 速度(初始化与添加)和比较速度

c# - 在 c# 中为 Vector256 准备数据的最快方法是什么?

c++ - 使用 Rcpp 查找重复项

java - 打印数组中不同的整数