我有2个对象数组
如何比较两个对象数组并获取具有相同id的用户的详细信息?
users:[{
id:"1",
displayName: "test"
email: "abc@gmail.com"
},
{
id:"2",
displayName: "test2"
email: "abc@gmail.com"
}]
listingAgents:[{
userId:"1",
listingId:"1354"
]}发布于 2021-03-12 15:55:53
两个数组具有相同id的相同对象?如果是:
users2_id = users2.map(u => u.id)
common_users = users1.filter(u => users2_id.includes(u.id))如果不是
common_users = users1.filter(u => {
user_2 = users2.find(u_2 => u_2.id === u.id)
if (!user_2) {
return false;
// do your stuff with the two different objects with same id like
return {...u, ...user_2}
});但是要注意它的复杂性!
编辑:
实际上,对于第二部分,你可以先过滤一个数组,然后再玩它,你会删除很多无用的对象,并根据数组的大小减少操作的数量!例如:
users1_id = users1.map(u => u.id)
users2_filtered = users2.filter(u => users1_id.includes(u.id)发布于 2021-03-12 17:14:11
const users = [{
id: "1",
displayName: "test",
email: "abc@gmail.com"
},
{
id: "2",
displayName: "test2",
email: "abc@gmail.com"
}
]
const listingAgents = [{
userId: "1",
listingId: "1354"
}]
let results = users.filter((user) => listingAgents.find((x) => x.userId == user.id));
console.log(results)
您可以筛选其中一个数组,然后使用find to查看该id是否存在于其他数组中
发布于 2021-03-15 22:48:51
您所需的输出格式不清晰。我假设您希望将匹配的用户合并到每个列表中。因此,输入如下:
const users = [
{id:"1", displayName: "test", email: "abc@gmail.com"},
{id:"2", displayName: "test2", email: "abc@gmail.com"}
]
const listingAgents = [
{userId:"1", listingId:"1354"},
{userId:"no match", listingId:"2465"}
]getListings (users) (listingAgents)应返回以下内容:
[
{
"userId": "1",
"listingId": "1354",
"id": "1",
"displayName": "test",
"email": "abc@gmail.com",
},
{
"userId": "no match",
"listingId": "2465",
}
]由于这是用Ramda标记的,首先请注意,我们当然可以用Ramda来做这件事。这里有一个解决方案:
const {pipe, indexBy, prop, flip, propOr, o, chain, merge, map} = R
const getListings = pipe (
indexBy (prop ('id')),
flip (propOr ({})),
flip (o) (prop ('userId')),
chain (merge),
map
)
const users = [{id:"1", displayName: "test", email: "abc@gmail.com"}, {id:"2", displayName: "test2", email: "abc@gmail.com"}]
const listingAgents = [{userId:"1", listingId:"1354"}, {userId:"no match", listingId:"2465"}]
console .log (getListings (users) (listingAgents))<script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.27.1/ramda.min.js"></script>
它相当简洁,但我不认为它的可读性特别好。flip调用(或者等同地,使用Ramda's placeholder的东西使代码在我看来不是很清楚。相反,我们可能会选择香草JS,如下所示:
const getListings = (users) => (agents) =>
agents .map ((agent) => ({
... agent,
... (users .find (({id}) => id == agent.userId) ?? {})
}))
const users = [{id:"1", displayName: "test", email: "abc@gmail.com"}, {id:"2", displayName: "test2", email: "abc@gmail.com"}]
const listingAgents = [{userId:"1", listingId:"1354"}, {userId:"no match", listingId:"2465"}]
console .log (getListings (users) (listingAgents)).as-console-wrapper {max-height: 100% !important; top: 0}
不过,Ramda版本有一个真正的优势。它只对用户编制一次索引,而不是在每次调用时都对其进行搜索。(这就是indexBy在这里做的事情。)
const getListings3 = (
users,
index = Object .fromEntries (users .map (u => [u.id, u]))
) => (agents) =>
agents .map ((agent) => ({
... agent,
... (index [agent.userId] ?? {})
}))或者等效地,这是:
const getListings3 = (users) => {
const index = Object .fromEntries (users .map (u => [u.id, u]))
return (agents) =>
agents .map ((agent) => ({
... agent,
... (index [agent.userId] ?? {})
}))
}无论哪种情况,我现在都在Ramda版本和vanilla版本的可读性之间左右为难。
https://stackoverflow.com/questions/66596043
复制相似问题