首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >比较2个对象数组并使用Ramda.js获取详细信息

比较2个对象数组并使用Ramda.js获取详细信息
EN

Stack Overflow用户
提问于 2021-03-12 15:45:20
回答 3查看 67关注 0票数 0

我有2个对象数组

如何比较两个对象数组并获取具有相同id的用户的详细信息?

代码语言:javascript
运行
复制
users:[{
 id:"1",
 displayName: "test"
 email: "abc@gmail.com"
},
{
 id:"2",
 displayName: "test2"
 email: "abc@gmail.com"
}]

listingAgents:[{
 userId:"1",
 listingId:"1354"
]}
EN

回答 3

Stack Overflow用户

发布于 2021-03-12 15:55:53

两个数组具有相同id的相同对象?如果是:

代码语言:javascript
运行
复制
users2_id = users2.map(u => u.id)
common_users = users1.filter(u => users2_id.includes(u.id))

如果不是

代码语言:javascript
运行
复制
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}
});

但是要注意它的复杂性!

编辑:

实际上,对于第二部分,你可以先过滤一个数组,然后再玩它,你会删除很多无用的对象,并根据数组的大小减少操作的数量!例如:

代码语言:javascript
运行
复制
users1_id = users1.map(u => u.id)
users2_filtered = users2.filter(u => users1_id.includes(u.id)
票数 1
EN

Stack Overflow用户

发布于 2021-03-12 17:14:11

代码语言:javascript
运行
复制
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是否存在于其他数组中

票数 0
EN

Stack Overflow用户

发布于 2021-03-15 22:48:51

您所需的输出格式不清晰。我假设您希望将匹配的用户合并到每个列表中。因此,输入如下:

代码语言:javascript
运行
复制
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)应返回以下内容:

代码语言:javascript
运行
复制
[
  {
    "userId": "1",
    "listingId": "1354",
    "id": "1",
    "displayName": "test",
    "email": "abc@gmail.com",
  },
  {
    "userId": "no match",
    "listingId": "2465",
  }
]

由于这是用Ramda标记的,首先请注意,我们当然可以用Ramda来做这件事。这里有一个解决方案:

代码语言:javascript
运行
复制
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))
代码语言:javascript
运行
复制
<script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.27.1/ramda.min.js"></script>

它相当简洁,但我不认为它的可读性特别好。flip调用(或者等同地,使用Ramda's placeholder的东西使代码在我看来不是很清楚。相反,我们可能会选择香草JS,如下所示:

代码语言:javascript
运行
复制
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))
代码语言:javascript
运行
复制
.as-console-wrapper {max-height: 100% !important; top: 0}

不过,Ramda版本有一个真正的优势。它只对用户编制一次索引,而不是在每次调用时都对其进行搜索。(这就是indexBy在这里做的事情。)

代码语言:javascript
运行
复制
const getListings3 = (
  users, 
  index = Object .fromEntries (users .map (u => [u.id, u]))
) => (agents) => 
  agents .map ((agent) => ({
    ... agent,
    ... (index [agent.userId] ?? {})
  }))

或者等效地,这是:

代码语言:javascript
运行
复制
const getListings3 = (users) => {
  const index = Object .fromEntries (users .map (u => [u.id, u]))
  return (agents) => 
    agents .map ((agent) => ({
      ... agent,
      ... (index [agent.userId] ?? {})
    }))
}

无论哪种情况,我现在都在Ramda版本和vanilla版本的可读性之间左右为难。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66596043

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档