如何根据 javascript 中的日期有条件地加入两个数组
How to join two array conditionally based on the date in javascript
我有两个具有相同 iD 的用户数组。我想根据每个用户拥有的 updatedAt 属性 合并它们。 updatedAt 属性 较新的用户优先。
const users1 = [
{ id: 1, name: 'user1', childUsers: [2], updatedAt: '2022-02-23T00:00:00.000Z' },
{ id: 2, name: 'user2', childUsers: [3, 4], updatedAt: '2022-01-26T00:00:00.000Z' },
{ id: 3, name: 'user3', childUsers: [2, 3], updatedAt: '2022-02-24T00:00:00.000Z' },
{ id: 4, name: 'user4', childUsers: [2, 4], updatedAt: '2022-02-26T00:00:00.000Z' },
]
const users2 = [
{ id: 1, name: 'user1', childUsers: [2], updatedAt: '2022-02-26T00:00:00.000Z' },
{ id: 2, name: 'user2.1', childUsers: [3, 4], updatedAt: '2022-02-27T00:00:00.000Z' },
{ id: 3, name: 'user3', childUsers: [2, 3], updatedAt: '2022-02-26T00:00:00.000Z' },
{ id: 4, name: 'user4.1', childUsers: [2, 4], updatedAt: '2022-02-27T00:00:00.000Z' },
]
输出应该是
const mergedUsers = [
{ id: 1, name: 'user1', childUsers: [2], updatedAt: '2022-02-26T00:00:00.000Z' },
{ id: 2, name: 'user2.1', childUsers: [3, 4], updatedAt: '2022-02-27T00:00:00.000Z' },
{ id: 3, name: 'user3', childUsers: [2, 3], updatedAt: '2022-02-26T00:00:00.000Z' },
{ id: 4, name: 'user4.1', childUsers: [2, 4], updatedAt: '2022-02-27T00:00:00.000Z' },
]
您可以使用 Array.reduce()
按 ID 对用户进行分组,用较新的 updatedAt
替换任何条目 属性。
一旦我们有了分组的用户,我们就可以使用Object.values()
得到想要的结果:
const users1 = [
{ id: 1, name: 'user1', childUsers: [2], updatedAt: '2022-02-23T00:00:00.000Z' },
{ id: 2, name: 'user2', childUsers: [3, 4], updatedAt: '2022-01-26T00:00:00.000Z' },
{ id: 3, name: 'user3', childUsers: [2, 3], updatedAt: '2022-02-24T00:00:00.000Z' },
{ id: 4, name: 'user4', childUsers: [2, 4], updatedAt: '2022-02-26T00:00:00.000Z' },
]
const users2 = [
{ id: 1, name: 'user1', childUsers: [2], updatedAt: '2022-02-26T00:00:00.000Z' },
{ id: 2, name: 'user2.1', childUsers: [3, 4], updatedAt: '2022-02-27T00:00:00.000Z' },
{ id: 3, name: 'user3', childUsers: [2, 3], updatedAt: '2022-02-26T00:00:00.000Z' },
{ id: 4, name: 'user4.1', childUsers: [2, 4], updatedAt: '2022-02-27T00:00:00.000Z' },
]
const result = Object.values([...users1, ...users2].reduce((acc, user) => {
// Entry either does not exist or has an older updatedAt property
if (!acc[user.id] || (user.updatedAt > acc[user.id].updatedAt)) {
acc[user.id] = user;
}
return acc;
}, {}))
console.log('Result:', result)
您想将第一个数组中的每个用户与第二个数组中的相似用户进行比较,并选择具有较高更新日期的用户。
const users1 = [...];
const users2 = [...];
const merged = users1.map((user1) => {
// loop through the users1 array
const duplicateUser = users2.find((user2) => user1.id === user2.id);
// if a similar user was found
if (duplicateUser) {
// compare and return the user with the newer updatedAt date
return new Date(duplicateUser.updatedAt) > new Date(user1.updatedAt)
? duplicateUser
: user1;
}
return user1; // in the case of no duplicates
});
console.log(merged);
我有两个具有相同 iD 的用户数组。我想根据每个用户拥有的 updatedAt 属性 合并它们。 updatedAt 属性 较新的用户优先。
const users1 = [
{ id: 1, name: 'user1', childUsers: [2], updatedAt: '2022-02-23T00:00:00.000Z' },
{ id: 2, name: 'user2', childUsers: [3, 4], updatedAt: '2022-01-26T00:00:00.000Z' },
{ id: 3, name: 'user3', childUsers: [2, 3], updatedAt: '2022-02-24T00:00:00.000Z' },
{ id: 4, name: 'user4', childUsers: [2, 4], updatedAt: '2022-02-26T00:00:00.000Z' },
]
const users2 = [
{ id: 1, name: 'user1', childUsers: [2], updatedAt: '2022-02-26T00:00:00.000Z' },
{ id: 2, name: 'user2.1', childUsers: [3, 4], updatedAt: '2022-02-27T00:00:00.000Z' },
{ id: 3, name: 'user3', childUsers: [2, 3], updatedAt: '2022-02-26T00:00:00.000Z' },
{ id: 4, name: 'user4.1', childUsers: [2, 4], updatedAt: '2022-02-27T00:00:00.000Z' },
]
输出应该是
const mergedUsers = [
{ id: 1, name: 'user1', childUsers: [2], updatedAt: '2022-02-26T00:00:00.000Z' },
{ id: 2, name: 'user2.1', childUsers: [3, 4], updatedAt: '2022-02-27T00:00:00.000Z' },
{ id: 3, name: 'user3', childUsers: [2, 3], updatedAt: '2022-02-26T00:00:00.000Z' },
{ id: 4, name: 'user4.1', childUsers: [2, 4], updatedAt: '2022-02-27T00:00:00.000Z' },
]
您可以使用 Array.reduce()
按 ID 对用户进行分组,用较新的 updatedAt
替换任何条目 属性。
一旦我们有了分组的用户,我们就可以使用Object.values()
得到想要的结果:
const users1 = [
{ id: 1, name: 'user1', childUsers: [2], updatedAt: '2022-02-23T00:00:00.000Z' },
{ id: 2, name: 'user2', childUsers: [3, 4], updatedAt: '2022-01-26T00:00:00.000Z' },
{ id: 3, name: 'user3', childUsers: [2, 3], updatedAt: '2022-02-24T00:00:00.000Z' },
{ id: 4, name: 'user4', childUsers: [2, 4], updatedAt: '2022-02-26T00:00:00.000Z' },
]
const users2 = [
{ id: 1, name: 'user1', childUsers: [2], updatedAt: '2022-02-26T00:00:00.000Z' },
{ id: 2, name: 'user2.1', childUsers: [3, 4], updatedAt: '2022-02-27T00:00:00.000Z' },
{ id: 3, name: 'user3', childUsers: [2, 3], updatedAt: '2022-02-26T00:00:00.000Z' },
{ id: 4, name: 'user4.1', childUsers: [2, 4], updatedAt: '2022-02-27T00:00:00.000Z' },
]
const result = Object.values([...users1, ...users2].reduce((acc, user) => {
// Entry either does not exist or has an older updatedAt property
if (!acc[user.id] || (user.updatedAt > acc[user.id].updatedAt)) {
acc[user.id] = user;
}
return acc;
}, {}))
console.log('Result:', result)
您想将第一个数组中的每个用户与第二个数组中的相似用户进行比较,并选择具有较高更新日期的用户。
const users1 = [...];
const users2 = [...];
const merged = users1.map((user1) => {
// loop through the users1 array
const duplicateUser = users2.find((user2) => user1.id === user2.id);
// if a similar user was found
if (duplicateUser) {
// compare and return the user with the newer updatedAt date
return new Date(duplicateUser.updatedAt) > new Date(user1.updatedAt)
? duplicateUser
: user1;
}
return user1; // in the case of no duplicates
});
console.log(merged);