在此处使用JavaScript对象避免当前For循环中出现For循环的解决方案

bgibtngc  于 2023-03-21  发布在  Java
关注(0)|答案(2)|浏览(130)

这里我有三个数组

  • orderdIds:包含所有ordersIds
  • 关联用户:它包含订单的所有关联用户。
  • users:它包含所有用户详细信息。

现在我必须将用户的数据设置到associatedUsers变量中。那么我如何在一个循环中做到这一点呢?

const orderIds = [101, 102];
const associatedUsers = [{ orderId: 101, userIds: [1, 2] }, { orderId: 102, userIds: [2] }];
const users = [{ userId: 1, email: 'email1' }, { userId: 2, email: 'email2' }];

associatedUsers.map((user) => {
    user.userIds.map((u, index) => {
        const userIndex = users.findIndex((use) => { return u === use.userId; });
        console.log(userIndex)
        if (userIndex > -1) {
            user.userIds[index] = users[userIndex]
        }
    })
});

console.log(associatedUsers);
2guxujil

2guxujil1#

你需要做的基本上是一个需要嵌套迭代的操作。用英语说,你要做的是:* 对于每个“关联用户”,遍历userIds并找到匹配的用户。* 因此嵌套循环是唯一真实的的方法。
但是,有一种方法可以将计算复杂度降低一个数量级,从O(n * m)n:所有阵列中userIds的总数,m:首先将users数组转换为一个以userId为索引的对象,然后就可以避开.findIndex,只查找对象上的ID。

const orderIds = [101, 102];
const associatedUsers = [{ orderId: 101, userIds: [1, 2] }, { orderId: 102, userIds: [2] }];
const users = [{ userId: 1, email: 'email1' }, { userId: 2, email: 'email2' }];

const usersById = Object.fromEntries(
  users.map(
    user => [user.userId, user]
  )
);
for (const aUser of associatedUsers) {
    aUser.userIds = aUser.userIds.map(id => usersById[id] ?? id);
}

console.log(associatedUsers);
wfsdck30

wfsdck302#

首先,我们创建一个用户Map,它允许我们通过用户的id来查找用户,而不需要每次都循环遍历整个users数组。
然后为每个关联创建一个users数组,并为每个userId值从map中获取用户并将其添加到users数组中。
因此,这在一个for循环中工作,但从技术上讲,它仍然是2个循环,因为在for循环中,我们有.map,它循环通过associtaion.userIds
它不能被进一步简化或优化。

const orderIds = [101, 102];
const associatedUsers = [{ orderId: 101, userIds: [1, 2] }, { orderId: 102, userIds: [2] }];
const users = [{ userId: 1, email: 'email1' }, { userId: 2, email: 'email2' }];

const userMap = new Map(users.map(user => [user.userId, user]));
for (const association of associatedUsers) {
    association.users = association.userIds.map(userId => userMap.get(userId));
}
console.log(associatedUsers);

相关问题