首页 > 解决方案 > 如何区分两个数组?

问题描述

我只想获得不是朋友的用户

我有两个列表,朋友和用户,如果他们已经是朋友,那么用户列表应该不再存在

friends = [{
  friend: {
    id: 3,
    name: "tres"
  },
  owner: {
    id: 1,
    name: "uno"
  }
}];

let users = [{
  id: 1,
  name: "uno",
}, {
  id: 2,
  name: "dos"
}]

users = users.filter(currentUser =>
  let flag = false, friends.forEach(function(current) {
      if (currentUser.id == current.friend.id) {
        flag = true;
      }
    }
    return flag;
  ));

console.log(users);

我可以在函数 FILTER 中使用 FOR 吗?是正确的?

标签: javascript

解决方案


如果我理解正确,您的friends数组是关系列表。所以

{
  friend: {id: 3, name: "tres"},
  owner: {id: 1,  name: "uno"}
}

表示用户 id 1 是用户 id 3 的朋友。

因此,要检查一个集合,只需使用Array.prototype.someor Array.prototype.every,无论哪个读得更好:

const friendless = (users, friends) =>
  users.filter(user => !friends.some(relationship => relationship.friend.id === user.id))

let users = [
  {id: 1, name: "uno"},
  {id: 2, name: "dos"},
  {id: 3, name: "tres"}
]

let friends = [{
  friend: {id: 3, name: "tres"},
  owner: {id: 1,  name: "uno"}
},{
  friend: {id: 2, name: "dos"},
  owner: {id: 1, name: "uno"}
}, {
  friend: {id: 3, name: "tres"},
  owner: {id: 2, name: "dos"}
}];


console .log (
  friendless (users, friends)
)

(或像这样:

const friendless = (users, friends) =>
  users.filter(user => friends.every(relationship => relationship.friend.id !== user.id))

更新

我不知道您是否可以控制 and 的结构usersfriends但如果可以,您可能需要重新考虑您的数据结构。您当前的方法似乎有很多不必要的重复。

这些方法中的任何一种都可以清理它:

一个

let users = [
  {id: 1, name: "uno"},
  {id: 2, name: "dos"},
  {id: 3, name: "tres"}
]

let friends = [
  {id: 1, friend: 3},
  {id: 1, friend: 2},
  {id: 2, friend: 3},
];

let users = [
  {id: 1, name: "uno"},
  {id: 2, name: "dos"},
  {id: 3, name: "tres"}
]

let friends = [
  [1, 3],
  [1, 2],
  [2, 3],
];

C

let users = [
  {id: 1, name: "uno", friends: [3, 2]},  // (or `friendIds`)
  {id: 2, name: "dos", friends: [3]},
  {id: 3, name: "tres", friends: []}
]

选项 C 对您当前的问题特别有用:

const friendless = users => users.filter(u => u.friends.length === 0)

推荐阅读