JavaScript ES6+ 比较对象数组中的字段
JavaScript ES6+ compare fields in arrays of objects
在这里旋转我的轮子。从概念上看似乎很简单,但 JS 正试图杀死我。
两个对象数组:
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,
}
];
我需要将第一个数组中的对象中的“id”字段与第二组数组中的“auth_user_id”字段进行比较。基本上,根据这两个字段的匹配,数组一中的所有用户都应该存在于数组二中。
这行不通(不是 shorthand 所以很容易调试):
let allMatched = allAuthUsers.every(x => {
return allProfileUsers.some(pu => {
return x.id === pu.auth_user_id;
});
});
...returns 错误;
当然,我可以手动遍历每个值并进行比较。除非别无他法,否则我不想这样。
我不得不认为 JS 有能力使用更优雅的单线箭头。事实上,令人沮丧的是,我知道我以前做过,但我今天似乎做不到。
哥们,我觉得答案就在你的问题里。您需要先遍历第一个数组(allProfileUsers),然后检查它是否存在于第二个(allAuthUsers)中。
let allMatched = allProfileUsers.every(pu => {
return allAuthUsers.some(x => {
return x.id === pu.auth_user_id;
});
});
试试下面的方法。将数组值之一处理为 Set
并使用另一个数组 every
方法。
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)
在这里旋转我的轮子。从概念上看似乎很简单,但 JS 正试图杀死我。
两个对象数组:
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,
}
];
我需要将第一个数组中的对象中的“id”字段与第二组数组中的“auth_user_id”字段进行比较。基本上,根据这两个字段的匹配,数组一中的所有用户都应该存在于数组二中。
这行不通(不是 shorthand 所以很容易调试):
let allMatched = allAuthUsers.every(x => {
return allProfileUsers.some(pu => {
return x.id === pu.auth_user_id;
});
});
...returns 错误;
当然,我可以手动遍历每个值并进行比较。除非别无他法,否则我不想这样。
我不得不认为 JS 有能力使用更优雅的单线箭头。事实上,令人沮丧的是,我知道我以前做过,但我今天似乎做不到。
哥们,我觉得答案就在你的问题里。您需要先遍历第一个数组(allProfileUsers),然后检查它是否存在于第二个(allAuthUsers)中。
let allMatched = allProfileUsers.every(pu => {
return allAuthUsers.some(x => {
return x.id === pu.auth_user_id;
});
});
试试下面的方法。将数组值之一处理为 Set
并使用另一个数组 every
方法。
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)