映射2个多个数组以按键构建一个的最佳解决方案是什么? 我有一个数组,其用户的个人资料数据如
var users = [{id:5, name:'Alex'}, {id:17, name:'Tom'}, {id:11, name:'John'}];
此外,我还有另一个带有密钥user_id的汽车数组来确定哪台机器属于哪个用户。
var cars = [{id:333, name:'Nissan', user_id:11}, {id:444, name:'Toyota', user_id:17}, {id:555, name:'BMW', user_id:999}];
所以我们可以看到汤姆有丰田,约翰有日产。
所以结果应该是 一个带有映射结果的新数组
[{
"profile": {
"id": 17,
"name": "Tom"
},
"car": {
"id": 444,
"name": "Toyota",
"user_id": 17
}
}, {
"profile": {
"id": 11,
"name": "John"
},
"car": {
"id": 333,
"name": "Nissan",
"user_id": 11
}
}]
我的解决方案是用于每个throw用户和sub forEach throw cars,并将user.id与car.user_id进行比较
答案 0 :(得分:2)
您可以使用双循环方法而不是嵌套循环方法,首先收集哈希表中的所有用户,然后迭代所有汽车,如果用户可用,则创建新的结果集。
var users = [{ id: 5, name: 'Alex' }, { id: 17, name: 'Tom' }, { id: 11, name: 'John' }],
cars = [{ id: 333, name: 'Nissan', user_id: 11 }, { id: 444, name: 'Toyota', user_id: 17 }, { id: 555, name: 'BMW', user_id: 999 }],
hash = {},
result = [];
users.forEach(function (user) {
hash[user.id] = user;
});
cars.forEach(function (car) {
if (hash[car.user_id]) {
result.push({ profile: hash[car.user_id], car: car });
}
});
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
答案 1 :(得分:0)
另一种解决方案
const mappedUsersCars = users.map((user) => ({
profile: user,
car: cars.filter((car) => car.user_id === user.id)[0]
}))
答案 2 :(得分:0)
您可以使用reduce()
和find()
方法获得所需的结果。
var users = [{id:5, name:'Alex'}, {id:17, name:'Tom'}, {id:11, name:'John'}];
var cars = [{id:333, name:'Nissan', user_id:11}, {id:444, name:'Toyota', user_id:17}, {id:555, name:'BMW', user_id:999}];
var r = users.reduce(function(r, e) {
var car = cars.find(a => a.user_id == e.id);
if(car) r.push({profile: e, car: car});
return r;
}, [])
console.log(r)

答案 3 :(得分:0)
您基本上有两种方法可以使用。您希望map
用户使用汽车,因此您希望find
为您所指的用户提供汽车
const result = users.map((user) => {
const car = cars.find(car => car.user_id === user.id);
return {
profile: user,
car,
}
})