1
votes

Créer un nouveau tableau à partir d'un tableau d'objets avec les clés d'un autre objet

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'},
];


8 commentaires

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


5 Réponses :


1
votes

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


0 commentaires

0
votes

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


1 commentaires

votre code ne donne pas le résultat souhaité, le tableau output n'est pas trié par élément id



2
votes

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


0 commentaires

0
votes

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


0 commentaires

1
votes

Pour créer le nouveau tableau, il doit être traité en deux étapes:

  1. Gardez la première voiture avec une marque unique de la gamme de voitures
  2. Joindre la quantité à la 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);


0 commentaires