【发布时间】:2019-08-29 10:12:08
【问题描述】:
我的要求是根据Phone 或Email 从两个数组中查找共同对象,即如果电话是null or '',则使用电子邮件查找共同对象,反之亦然。从两个数组中找到共同点后,我想合并这两个对象,使它们都具有相同的键/值对。我设法找到了共同点,但未能合并它们。这是我到目前为止所做的。
数组1:
[
{
"Name": "Name1",
"Phone": "",
"Email": "name1@mail.com",
"ID": 1
},
{
"Name": "Name2",
"Phone": "12345566",
"Email": "name2@mail.com",
"ID": 2
}
]
数组2:
[
{
"Name": "Name1",
"Phone": "987654321",
"Email": "name1@mail.com"
},
{
"Name": "Name2",
"Phone": "12345566",
"Email": "name2@mail.com"
},
{
"Name": "Name3",
"Phone": "23445677",
"Email": ""
}
]
这就是我设法从这两者中获得共同点的方法。
const common = array1
.filter(user=>
array2.some(otherUser =>
(user.Email && (user.Email === otherUser.Email)) ||
(user.Phone && (user.Phone === otherUser.Phone))));
如何在不使用common 数组上的循环的情况下合并这两个,因为这将花费大量时间,因为我的数组中的数据可能包含数千条记录?
使用ES6 实现这一目标的最佳方法是什么?
【问题讨论】:
-
但是你的
filter函数已经在他的核心中循环了。为什么不将filter替换为循环,它会过滤并将数据添加到array1? -
有没有可能,具有相同电子邮件/电话的记录有不同的名称?预期的结果数组可以用于完整的问题陈述。
-
@YevgenGorbunkov 是的,记录也可以有不同的名称
-
数据从何而来?如果它来自数据库连接,那么优化查询而不是通过代码过滤/合并可能是有意义的,因为您不会摆脱公共循环。
-
一万条记录和重复搜索,你需要重新排列你的数据。考虑创建按电话或电子邮件分组的数据的索引版本,这将使这些类型的操作快速而直接。
标签: javascript arrays ecmascript-6