2017-10-20 15 views
0

Quelle est la meilleure solution pour mapper 2 tableaux multiples pour construire un par clé? Je 1 tableau avec les utilisateurs qui ont leurs données de profil commeConstruire des tableaux JS par clé en un - trouver une meilleure solution

var users = [{id:5, name:'Alex'}, {id:17, name:'Tom'}, {id:11, name:'John'}]; 

Aussi j'ai une autre gamme de voitures avec user_id clé pour déterminer quelle machine appartient à quel utilisateur.

var cars = [{id:333, name:'Nissan', user_id:11}, {id:444, name:'Toyota', user_id:17}, {id:555, name:'BMW', user_id:999}]; 

Donc nous pouvons voir que Tom a Toyota et John ont Nissan.

Donc, résultat devrait être un nouveau tableau avec un résultat cartographié

[{ 
"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 
} 

}]

Ma solution est l'utilisation forEach utilisateurs de jet et les voitures jeter sous forEach et il user.id comparer avec car.user_id

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

+0

Bon, vous avez une solution. Donc quel est le problème? –

+0

Je veux trouver la meilleure solution. Ma solution semble oldschool, je pense :) – maxxdev

Répondre

2

Vous pouvez utiliser une approche à deux boucles au lieu d'une approche de boucle imbriquée par c ollectionnez d'abord tous les utilisateurs dans une table de hachage et ensuite itérez toutes les voitures et si un utilisateur est disponible, créez un nouveau jeu de résultats.

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; }

0

Une autre solution

const mappedUsersCars = users.map((user) => ({ 
    profile: user, 
    car: cars.filter((car) => car.user_id === user.id)[0] 
})) 
0

Vous pouvez utiliser reduce() et find() méthodes pour obtenir résultat souhaité.

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)

0

Il existe essentiellement deux méthodes que vous souhaitez utiliser. Vous voulez map les utilisateurs aux voitures, donc vous voulez find une voiture pour l'utilisateur que vous faites référence à

const result = users.map((user) => { 
    const car = cars.find(car => car.user_id === user.id); 
    return { 
     profile: user, 
     car, 
    } 
})