按键构建JS数组到一个 - 找到最佳解决方案

时间:2017-10-20 08:02:21

标签: javascript arrays mapping

映射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进行比较

https://jsfiddle.net/r7qwke1f/37/

4 个答案:

答案 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,
    }
})