这里我有三个数组
- 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);
2条答案
按热度按时间2guxujil1#
你需要做的基本上是一个需要嵌套迭代的操作。用英语说,你要做的是:* 对于每个“关联用户”,遍历
userIds
并找到匹配的用户。* 因此嵌套循环是唯一真实的的方法。但是,有一种方法可以将计算复杂度降低一个数量级,从
O(n * m)
(n
:所有阵列中userIds
的总数,m
:首先将users
数组转换为一个以userId
为索引的对象,然后就可以避开.findIndex
,只查找对象上的ID。wfsdck302#
首先,我们创建一个用户Map,它允许我们通过用户的id来查找用户,而不需要每次都循环遍历整个users数组。
然后为每个关联创建一个users数组,并为每个userId值从map中获取用户并将其添加到users数组中。
因此,这在一个for循环中工作,但从技术上讲,它仍然是2个循环,因为在for循环中,我们有
.map
,它循环通过associtaion.userIds
。它不能被进一步简化或优化。