J'ai un tableau d'objets "voitures"
newArray = [ {id: 1, name: 'Mercedes', year: '2015', quantity: 2}, {id: 3, name: 'BMW', year: '2010', quantity: 6}, {id: 5, name: 'Volvo', year: '2012', quantity: 3}, {id: 8, name: 'Toyota', year: '2012', quantity: 1}, {id: 8, name: 'Jeep', year: '2011', quantity: 1}, ]
et un objet qui contient la quantité de voitures
let obj = { BMW: 6, Jeep: 1, Mercedes: 2, Toyota: 1, Volvo: 3, }
Je dois créez un nouveau tableau à partir de voitures qui n'auront qu'une seule copie d'objet et ajoutez la propriété "quantité" à l'objet approprié. Comment puis-je y parvenir?
Résultat attendu.
let cars = [ {id: 1, name: 'Mercedes', year: '2015'}, {id: 2, name: 'Mercedes', year: '2000'}, {id: 3, name: 'BMW', year: '2010'}, {id: 4, name: 'BMW', year: '2004'}, {id: 4, name: 'BMW', year: '2004'}, {id: 4, name: 'BMW', year: '2004'}, {id: 4, name: 'BMW', year: '2004'}, {id: 4, name: 'BMW', year: '2004'}, {id: 5, name: 'Volvo', year: '2012'}, {id: 6, name: 'Volvo', year: '2014'}, {id: 7, name: 'Volvo', year: '2010'}, {id: 8, name: 'Toyota', year: '2012'}, {id: 8, name: 'Jeep', year: '2011'}, ];
5 Réponses :
Création d'un nouveau tableau avec tous les éléments de l'objet cars
et le décompte de obj
sans aucune duplication.
let cars = [{"id":1,"name":"Mercedes","year":"2015"},{"id":2,"name":"Mercedes","year":"2000"},{"id":3,"name":"BMW","year":"2010"},{"id":4,"name":"BMW","year":"2004"},{"id":4,"name":"BMW","year":"2004"},{"id":4,"name":"BMW","year":"2004"},{"id":4,"name":"BMW","year":"2004"},{"id":4,"name":"BMW","year":"2004"},{"id":5,"name":"Volvo","year":"2012"},{"id":6,"name":"Volvo","year":"2014"},{"id":7,"name":"Volvo","year":"2010"},{"id":8,"name":"Toyota","year":"2012"},{"id":8,"name":"Jeep","year":"2011"}]; let obj = {BMW: 6,Jeep: 1,Mercedes: 2,Toyota: 1,Volvo: 3} let newObj = []; let duplicateCheck = [] cars.forEach(function(item) { if (!duplicateCheck.includes(item.name)) { duplicateCheck.push(item.name); item.quantity = obj[item.name]; newObj.push(item); } }); console.log(newObj);
Vous pouvez utiliser deux boucles pour faire correspondre les objets de vos deux tableaux:
let output = []; // For each key in your quantity object for (let model in obj) { // For each car object in your cars array for (let car of cars) { // This will match the first car in your cars array if (car.name === model) { // Add quantity to your car object and add it to your result set car.quantity = obj[model]; output.push(car); // This break will continue to the next model car to ensure you only have one result per model break; } } }
votre code ne donne pas le résultat souhaité, le tableau output
n'est pas trié par élément id
Vous pouvez compter directement en utilisant le tableau avec une table de hachage.
.as-console-wrapper { max-height: 100% !important; top: 0; }
let cars = [{ id: 1, name: 'Mercedes', year: '2015' }, { id: 2, name: 'Mercedes', year: '2000' }, { id: 3, name: 'BMW', year: '2010' }, { id: 4, name: 'BMW', year: '2004' }, { id: 4, name: 'BMW', year: '2004' }, { id: 4, name: 'BMW', year: '2004' }, { id: 4, name: 'BMW', year: '2004' }, { id: 4, name: 'BMW', year: '2004' }, { id: 5, name: 'Volvo', year: '2012' }, { id: 6, name: 'Volvo', year: '2014' }, { id: 7, name: 'Volvo', year: '2010' }, { id: 8, name: 'Toyota', year: '2012' }, { id: 8, name: 'Jeep', year: '2011' }], result = Object.values(cars.reduce((r, o) => { r[o.name] = r[o.name] || { ... o, quantity: 0 }; r[o.name].quantity++; return r; }, [])); console.log(result);
Utilisation des modules ES6
let cars = [ {id: 1, name: 'Mercedes', year: '2015'}, {id: 2, name: 'Mercedes', year: '2000'}, {id: 3, name: 'BMW', year: '2010'}, {id: 4, name: 'BMW', year: '2004'}, {id: 4, name: 'BMW', year: '2004'}, {id: 4, name: 'BMW', year: '2004'}, {id: 4, name: 'BMW', year: '2004'}, {id: 4, name: 'BMW', year: '2004'}, {id: 5, name: 'Volvo', year: '2012'}, {id: 6, name: 'Volvo', year: '2014'}, {id: 7, name: 'Volvo', year: '2010'}, {id: 8, name: 'Toyota', year: '2012'}, {id: 8, name: 'Jeep', year: '2011'}, ]; let obj = { BMW: 6, Jeep: 1, Mercedes: 2, Toyota: 1, Volvo: 3, } let filteredCar = cars.filter((curr, index) => { let _cars = JSON.stringify(curr); return index === cars.findIndex(obj => { return JSON.stringify(obj) === _cars; }) }).map(currCar => { currCar.quantity = obj[currCar.name]; return currCar}); console.log(filteredCar);
Pour créer le nouveau tableau, il doit être traité en deux étapes:
voiture
avec une marque unique de la gamme de voitures voiture
à partir de obj
let cars=[ {id:1,name:'Mercedes',year:'2015'}, {id:2,name:'Mercedes',year:'2000'}, {id:3,name:'BMW',year:'2010'}, {id:4,name:'BMW',year:'2004'}, {id:4,name:'BMW',year:'2004'}, {id:4,name:'BMW',year:'2004'}, {id:4,name:'BMW',year:'2004'}, {id:4,name:'BMW',year:'2004'}, {id:5,name:'Volvo',year:'2012'}, {id:6,name:'Volvo',year:'2014'}, {id:7,name:'Volvo',year:'2010'}, {id:8,name:'Toyota',year:'2012'}, {id:8,name:'Jeep',year:'2011'} ]; let obj = { BMW:6, Jeep:1, Mercedes:2, Toyota:1, Volvo:3, }; /* The first step: you can use .filter to only return the car you are looking for. */ let uniqueCarBrand = []; let newArray = cars.filter((car) => { /* Check if car name already in the newArray */ if (uniqueCarBrand.indexOf(car.name) >= 0) return false; uniqueCarBrand.push(car.name); return true; }); /* Second step: you will need to attach your quantity to the array of cars you just created. */ let result = newArray.map((car) => { /* Check if obj has brand name in it, if not, return 0; */ car.quantity = obj[car.name] || 0; return car; }); console.log(result);
qu'entendez-vous par une copie d'objet?
pouvez-vous donner un exemple de la sortie que vous attendez? Actuellement, il n'est pas clair si vous voulez des objets uniques par identifiant ou par nom
Je veux dire un seul élément avec la même propriété de nom
Ainsi, par exemple, vous avez 2 objets Mercedes: un pour 2015 et un pour 2000. Vous avez également une quantité Mercedes de 2. Comment savoir quelle année-modèle a quelle quantité? Si vous ne voulez qu'une seule propriété par propriété de nom unique, vous obtiendrez simplement l'objet de quantité que vous avez répertorié.
qu'en est-il de l '
id
et de l'année
dans les nouveaux objets?id et année, ils ne sont pas importants dans ce cas. J'ai édité le code avec l'exemple attendu
le nombre provient-il toujours du tableau réel?
@NinaScholz compte que je reçois du tableau des voitures