javascript - 当我需要一个复合键来使其与众不同时,如何创建一个不同的 javascript 对象列表?
问题描述
是的,有几篇关于用多种语言创建不同列表的帖子,但我没有看到任何关于使用复合键或复合键的内容。
我有一个重复的对象(联系人)数组,我需要从中创建一个不同值的数组,键是电子邮件、姓名和电话字段的组合。对象如下所示:
{
name: "Name",
email: "email@example.com",
phone: "5551212",
organization: "BigCompany",
title: "CEO"
}
我可以使用 map.has() 创建一个不同的列表,仅基于电子邮件:
const distinct = [];
const map = new Map();
for (const item of contacts) {
if(!map.has(item.email)){
map.set(item.email, true); // set any value, but add an entry to the Map
distinct.push(item);
}
}
...但是对于具有相同电子邮件但不同电话或相同电话但不同电子邮件等的每个联系人,我需要不同的数组元素。阅读有关文档map.has()
,我没有看到任何关于关键参数的信息复杂的数据结构(在这种情况下是多个字段)。有没有更好的工具,或者我只是错过了文档的那一部分?
解决方案
您可以创建一个 JSON 字符串用作键,如下所示:
const distinct = [];
const map = new Map();
for (const item of contacts) {
const {name, email, phone} = item;
const key = JSON.stringify({name, email, phone});
if(!map.has(key){
map.set(key, true);
distinct.push(item);
}
}
由于JSON.stringify
( spec | MDN ) 需要遵循 ES2015 的属性顺序(许多操作不是),您知道如果每次都以相同的方式创建对象并且所有可枚举属性都是“自己的”属性,则结果对于具有相同name
、、email
和属性值的对象,JSON 字符串将是相同的phone
(如果它们不同,则不同)。(“每次都以相同的方式创建对象”很重要,对象{a: 1, b: 2}
和{b: 2, a: 1}
结果会产生不同的JSON 字符串。)
旁注:如果您只是使用map.has
and map.set(key, true)
, aSet
可能更有意义:
const distinct = [];
const set = new Set();
for (const item of contacts) {
const {name, email, phone} = item;
const key = JSON.stringify({name, email, phone});
if(!set.has(key){
set.add(key);
distinct.push(item);
}
}
推荐阅读
- tkinter - 为什么我的滚动条和画布不同步?
- android - 导入 android.support.v4.app.NotificationCompat;
- jenkins - 如何不显示管道詹金斯的 contentreplace 执行内容
- javascript - Firebase 无论如何都无法进行身份验证
- python - 识别十进制数的正则表达式是什么
- list - 我想创建一个可以添加 x 数字或按钮的视图
- python-3.x - 使用 PIL(python)语法问题打开新图像
- opengl - glVertexAttribPointer 的直接状态访问版本
- excel - ADODB 连接不适用于 Excel 32 位
- javascript - jquery croppie 插件从我的 jquery 代码中停止“$(window).resize”函数