如何从对象数组中删除所有重复项?

2023-11-24

我有一个包含对象数组的对象。

obj = {};

obj.arr = new Array();

obj.arr.push({place:"here",name:"stuff"});
obj.arr.push({place:"there",name:"morestuff"});
obj.arr.push({place:"there",name:"morestuff"});

我想知道从数组中删除重复对象的最佳方法是什么。例如,obj.arr会成为...

{place:"here",name:"stuff"},
{place:"there",name:"morestuff"}

来点 ES6 魔法怎么样?

obj.arr = obj.arr.filter((value, index, self) =>
  index === self.findIndex((t) => (
    t.place === value.place && t.name === value.name
  ))
)

参考网址

更通用的解决方案是:

const uniqueArray = obj.arr.filter((value, index) => {
  const _value = JSON.stringify(value);
  return index === obj.arr.findIndex(obj => {
    return JSON.stringify(obj) === _value;
  });
});

使用上述属性策略代替JSON.stringify:

const isPropValuesEqual = (subject, target, propNames) =>
  propNames.every(propName => subject[propName] === target[propName]);

const getUniqueItemsByProperties = (items, propNames) => 
  items.filter((item, index, array) =>
    index === array.findIndex(foundItem => isPropValuesEqual(foundItem, item, propNames))
  );

如果你想要的话,你可以添加一个包装器propNames属性可以是数组或值:

const getUniqueItemsByProperties = (items, propNames) => {
  const propNamesArray = Array.from(propNames);

  return items.filter((item, index, array) =>
    index === array.findIndex(foundItem => isPropValuesEqual(foundItem, item, propNamesArray))
  );
};

允许两者getUniqueItemsByProperties('a') and getUniqueItemsByProperties(['a']);

堆栈闪电战示例

解释

  • Start by understanding the two methods used:
    • filter, 查找索引
  • 接下来,想想是什么让两个对象相等并牢记在心。
  • 如果某个东西满足我们刚刚想到的标准,但它的位置不是符合该标准的对象的第一个实例,那么我们可以将其检测为重复项。
  • 因此,我们可以使用上述标准来确定某物是否重复。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何从对象数组中删除所有重复项? 的相关文章

随机推荐

  • Git 如何记录(或更可能表示)其 blob 的文件路径和名称,然后识别重命名?

    我正在尝试了解 git 设法 记住 文件名及其路径的方式 因为它只将文件内容存储在 blob 中 解释是在链接在这里Abizem 写的不错吗 这是迄今为止我见过的最好的 后续问题是 git 如何 在哪里 确定我们何时具有相似性 特别是在 移
  • Python 等价于 vector::reserve()

    我正在寻找 C vector reserve 的 Python 等效项 我不知道列表会提前有多大 但我知道它会相当大 并且我希望尽可能避免调整大小 因为列表是在深层内部循环中增长的 到目前为止 我提出的唯一解决方案与 vector rese
  • 将映射值复制到 STL 中的向量[重复]

    这个问题在这里已经有答案了 目前正在努力学习Effective STL 第 5 条建议使用范围成员函数通常比使用单元素函数更可取 我目前希望将映射中的所有值 即 我不需要键 复制到向量中 最干净的方法是什么 你可能可以使用std trans
  • __stdcall的含义和用法是什么?

    我遇到过 stdcall这些天很多 MSDN 没有非常清楚地解释它的真正含义 何时以及为什么应该使用它 如果有的话 如果有人能提供解释 最好是举一两个例子 我将不胜感激 这个答案涵盖了 32 位模式 Windows x64 仅使用 2 个约
  • 在 JDBC 中处理 DATETIME 值 0000-00-00 00:00:00

    如果我尝试这样做 我会得到一个例外 见下文 resultset getString add date 对于包含 DATETIME 值 0000 00 00 00 00 00 DATETIME 的准空值 的 MySQL 数据库的 JDBC 连
  • 有效地查找大集合中具有低汉明距离的二进制字符串

    Problem 给定一个大 约 1 亿 无符号 32 位整数列表 一个无符号 32 位整数输入值和最大汉明距离 返回输入值的指定汉明距离内的所有列表成员 保存列表的实际数据结构是开放的 性能要求决定了内存中的解决方案 构建数据结构的成本是次
  • 在节目中跳入 Python 交互式会话?

    嘿 我想知道 我正在将 pydev 与 eclipse 一起使用 我真的很喜欢强大的调试功能 但我想知道 是否可以在eclipse中设置断点并在执行过程中跳转到交互式python解释器 我认为这会非常方便 edit 我想强调 我的目标不是跳
  • Symfony 2 注销(UserInterface::eraseCredentials)

    我想eraseCredentials是用来注销的吗 如果是这样 我如何清除教义实体的会话 No eraseCredentials 用于在持久化令牌之前擦除敏感数据 无论是序列化还是数据库 要以编程方式注销用户 您可以使用以下命令 this
  • JavaMail检查邮件内容 gmail IMAP

    我正在尝试阅读我的消息 我可以让它打印标题 但发件人和内容显示得很有趣 这是我用来显示消息的代码 int j message length 1 for int i j i gt 0 i System out println Message
  • 有什么方法可以知道流星订阅何时“有效”?

    如果我改变一个Sessionvar 并通过以下方式触发重新订阅autosubscribe 是否有任何回调机制可以等待 最新 数据从服务器上下来 1 如果你看一下这个要点您将看到一些代码 这些代码随着订阅的变化而记录集合的内容 输出的相关部分
  • 计算字符串在字符串中出现的次数[重复]

    这个问题在这里已经有答案了 我只是有一个看起来像这样的字符串 7 真 NA 假 67 假 NA 假 5 假 NA 假 5 假 NA 假 我想做的就是计算字符串出现了多少次 true 出现在该字符串中 我感觉答案是这样的String Coun
  • Python - 如何使用模块的别名来导入其子模块?

    我的模块名称很长 我想避免在文档中多次输入它 我可以简单地做import long ass module name as lamn并这样称呼它 但是 该模块有许多我也希望导入和使用的子模块 在这种情况下我将无法写import lamn su
  • max() 函数如何处理 python 中的字符串列表?

    我有一个清单 list1 123 xyz zara abc print Max value element max list1 它给 Max value element zara 另请解释它如何对字符串列表和数字列表进行比较 This is
  • 使用 ExcelDataReader 和 Epplus 访问受保护的 Excel 文件

    标题几乎说明了一切 寻找一种使用 ExcelDataReader 和 Epplus 访问受密码保护的 Excel 文件的方法 找不到正确的答案 如果使用 ExcelDataReader 我的代码如下所示 excelStream File O
  • 如何在 SOLR 中索引文档?

    我在 Ubuntu 10 04 上运行 Solr 1 4 通过 apt get solr tomcat 安装 它似乎工作正常 不过 我很难找到有关如何索引文档的任何连贯信息 我是 SOLR 新手 所以请耐心等待 我有一个已安装的 Windo
  • 天蓝色资源管理器服务总线提供商?

    有 ServiceBus 提供商这样的东西吗 作为我的应用程序的一部分 我想包含 SB 命名空间 主题和订阅 您是否期望使用 ARM 部署网站 并使用服务接口来编写其他支持功能的脚本 现在有一个服务总线提供商 样本模板 apiVersion
  • 如果“&String”没有实现“Into”,为什么这些实现会发生冲突?

    我问了一个相关问题关于为什么没有实施From lt String gt for String 我现在想创建自己的特质 如下所示 derive Debug struct MyStruct String impl MyStruct fn new
  • 如何知道谷歌帐户是否在谷歌应用程序域下?

    我正在开发一个应用程序 允许用户将他们的云端硬盘文件分享给朋友 但是Google App帐户存在问题 例如 email protected 其中的文件不能与不在该域下的人共享 尽管共享策略可以由管理员更改somedomain com 但我不
  • 设置 Java 编译器合规级别

    我需要在命令行上编译一个Java程序 并且我试图将编译器级别设置为较低的级别 1 6 我尝试过这样但没有成功 javac 1 6 Hello java Use source and target选项 javac target 1 6 sou
  • 如何从对象数组中删除所有重复项?

    我有一个包含对象数组的对象 obj obj arr new Array obj arr push place here name stuff obj arr push place there name morestuff obj arr p