1

Spinning my wheels here. Seems simple conceptually but JS is trying to kill me.

Two arrays of objects:

let allProfileUsers = [
    {
        id: "0b4cd920-31da-11ec-a31c-cd844bfb73be",
        auth_user_id: "fea98060-31ac-11ec-81f6-9b65b19a8154",
        active: true
    },
    {
        id: "0b4f9840-31da-11ec-a31c-cd844bfb73be",
        auth_user_id: "fea73670-31ac-11ec-81f6-9b65b19a8154",
        active: true
    },
    {
        id: "0b51e230-31da-11ec-a31c-cd844bfb73be",
        auth_user_id: "fea98060-31ac-11ec-81f6-9b65b19a8154",
        active: true
    }
];

let allAuthUsers = [
    {
        id: "fea4c570-31ac-11ec-81f6-9b65b19a8154",
        username: "user1",
        active: true,
    },
    {
        id: "fea73670-31ac-11ec-81f6-9b65b19a8154",
        username: "user2",
        active: true,
    },
    {
        id: "fea98060-31ac-11ec-81f6-9b65b19a8154",
        username: "user3",
        active: true,
    }
];

I need to compare the "id" field in the objects in the first array to the "auth_user_id" field in the second set of arrays. Basically, all users in array one should exist in array two, based on the match-up of those two fields.

This doesn't work (not shorthand so it's easy to debug):

let allMatched = allAuthUsers.every(x => {
    return allProfileUsers.some(pu => {
        return x.id === pu.auth_user_id;
    });
});

...returns false;

Of course, I could manually loop through each value and compare them. I don't want that unless there's no other way.

I have to think JS is capable of a more elegant one-liner with arrows. In fact, frustratingly, I know I've done this before, but I just can't seem to make it happen today.

3
  • "Of course, I could manually loop through each value and compare them". Why not? Commented Oct 20, 2021 at 21:06
  • 5
    The result is correct. fea4c570-31ac-11ec-81f6-9b65b19a8154 doesn't exist in allProfileUsers. Commented Oct 20, 2021 at 21:11
  • 2
    You seem to have "array one" and "array two" confused in your question. There's no auth_user_id property in the second array. Commented Oct 20, 2021 at 21:13

2 Answers 2

3

Buddy, I feel the answer is in your question. You need to loop through the first array(allProfileUsers) first and then check if it exist in second(allAuthUsers).


let allMatched = allProfileUsers.every(pu => {
    return allAuthUsers.some(x => {
            return x.id === pu.auth_user_id;
    });
});

Sign up to request clarification or add additional context in comments.

1 Comment

Yeah, duh. Long day and thought I had already run through it backwards like that.
0

Try some thing like below. Process one of array values to Set and use it another array every method.

let allProfileUsers = [
  {
    id: "0b4cd920-31da-11ec-a31c-cd844bfb73be",
    auth_user_id: "fea98060-31ac-11ec-81f6-9b65b19a8154",
    active: true,
  },
  {
    id: "0b4f9840-31da-11ec-a31c-cd844bfb73be",
    auth_user_id: "fea73670-31ac-11ec-81f6-9b65b19a8154",
    active: true,
  },
  {
    id: "0b51e230-31da-11ec-a31c-cd844bfb73be",
    auth_user_id: "fea98060-31ac-11ec-81f6-9b65b19a8154",
    active: true,
  },
];

let allAuthUsers = [
  {
    id: "fea4c570-31ac-11ec-81f6-9b65b19a8154",
    username: "user1",
    active: true,
  },
  {
    id: "fea73670-31ac-11ec-81f6-9b65b19a8154",
    username: "user2",
    active: true,
  },
  {
    id: "fea98060-31ac-11ec-81f6-9b65b19a8154",
    username: "user3",
    active: true,
  },
];

const auth = new Set(allAuthUsers.map(({ id }) => id));

const isExist = allProfileUsers.every(({ auth_user_id }) =>
  auth.has(auth_user_id)
);

console.log(isExist)

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.