2016-11-02 2 views
2

Ich habe zwei Arrays, wobei jedes Element ein Objekt ist:Wie erweitert man ein Objekt von einem anderen Objekt basierend auf den angegebenen Werten?

var cars = [{ 
    brand: "VW", 
    brand_id: "1", 
    models: [ 
    { 
     name: "Golf", 
     model_id: "1" 
    }, 
    { 
     name: "Passat", 
     model_id: "2" 
    } 
    ] 
}, 
{ 
    brand: "BMW", 
    brand_id: "2", 
    models: [ 
    { 
     name: "X3", 
     model_id: "1" 
    }, 
    { 
     name: "X5", 
     model_id: "2" 
    } 
    ] 
}]; 

var drivers = [{ 
    name: "Test Driver", 
    cars: [ 
    { 
     brand_id: "1", 
     model_id: "1" 
    }, 
    { 
     brand_id: "2", 
     model_id: "1" 
    } 
    ] 
}] 

Was ist der beste Weg, die Modellnamen in das Auto-Objekt für jeden Fahrer zu kopieren? Dies ist das erwartete Ergebnis:

var drivers = [{ 
    name: "Test", 
    cars: [ 
    { 
     brand_id: "1", 
     model_id: "1", 
     name: "Golf" 
    }, 
    { 
     brand_id: "2", 
     model_id: "1", 
     name: "X3" 
    } 
    ] 
}] 

Meine Idee war, eine Schleife durch die Fahrer, dann Schleife durch die Autos für jeden Fahrer, dann die Schleife durch die einzelnen Autos, dann Schleife ... so viel Schleifen. Ich hoffe, es gibt einen einfacheren Weg, dies zu lösen.

Antwort

0

Schleifen können Sie hier aufgrund der Datenstruktur nicht vermeiden. Aber man kann es in einer ziemlich saubere Art und Weise tun

var cars = [{"brand":"VW","brand_id":"1","models":[{"name":"Golf","model_id":"1"},{"name":"Passat","model_id":"2"}]},{"brand":"BMW","brand_id":"2","models":[{"name":"X3","model_id":"1"},{"name":"X5","model_id":"2"}]}]; 
 
var drivers = [{"name":"Test Driver","cars":[{"brand_id":"1","model_id":"1"},{"brand_id":"2","model_id":"1"}]}]; 
 

 
drivers.forEach(expandCars); 
 

 
function expandCars(driver) { 
 
    // map each car to list of car brands filtered by brand ID 
 
    // then to resulting list of car models by model ID 
 
    driver.cars = driver.cars.map(car => { 
 
    var carModels = cars.filter(carBrand => carBrand.brand_id == car.brand_id)[0].models; 
 
    var model = carModels.filter(carModel => carModel.model_id == car.model_id)[0]; 
 
    
 
    return Object.assign(car, model); 
 
    }); 
 
} 
 

 

 

 
console.log(drivers);

Ehrlich diese Datenstruktur unnötig komplex zu sein scheint. Warum ist cars eine Liste von Marken, und jede Marke hat eine Liste von Modellen? Warum nicht das cars Array wie das driver.cars Array, nur eine flache Liste, wo jedes Objekt hat die Marke und Modell? Dies würde das Suchen der Struktur für Autos viel einfacher machen. ModelID sollte auch für verschiedene Marken gelten. Sie können also einfach die Modell-ID überprüfen und wissen, dass die Marke identisch sein muss, wenn das Modell identisch ist.

+0

Vielen Dank! Die Datenstruktur ist eigentlich völlig anders (inhaltlich), versucht lediglich, es für ein Beispiel zu vereinfachen und gebrauchte Autos/Marken/Modelle zu verwenden. – passatgt

+0

Anstatt 'filter' zu verwenden und das erste Element des Ergebnisses zu verwenden, ist in diesen Tagen' find' oft vorzuziehen. –

0

Sie können dies mit zwei forEach() Schleifen tun, um jedes Objekt im Treiber-Array und dann das Auto-Array innerhalb des aktuellen Objekts zu wiederholen. Danach können Sie zwei find() Schleifen verwenden, um das Objekt in einem Autosystem mit demselben brand_id zu finden und dann innerhalb der Modelle das Objekt mit demselben model_id zu finden und das name zurückgeben.

var cars = [{"brand":"VW","brand_id":"1","models":[{"name":"Golf","model_id":"1"},{"name":"Passat","model_id":"2"}]},{"brand":"BMW","brand_id":"2","models":[{"name":"X3","model_id":"1"},{"name":"X5","model_id":"2"}]}]; 
 
var drivers = [{"name":"Test Driver","cars":[{"brand_id":"1","model_id":"1"},{"brand_id":"2","model_id":"1"}]}]; 
 

 
drivers.forEach(function(e) { 
 
    e.cars.forEach(function(c) { 
 
    c.name = cars.find(function(a) { 
 
     return a.brand_id == c.brand_id; 
 
    }).models.find(function(a) { 
 
     return c.model_id == a.model_id; 
 
    }).name 
 
    }) 
 
}) 
 

 
console.log(drivers)

0

Sie könnten eine Hash-Tabelle für die Autos verwenden und später den Namen zuweisen.

var cars = [{ brand: "VW", brand_id: "1", models: [{ name: "Golf", model_id: "1" }, { name: "Passat", model_id: "2" }] }, { brand: "BMW", brand_id: "2", models: [{ name: "X3", model_id: "1" }, { name: "X5", model_id: "2" }] }], 
 
    drivers = [{ name: "Test Driver", cars: [{ brand_id: "1", model_id: "1" }, { brand_id: "2", model_id: "1" }] }], 
 
    hash = Object.create(null); 
 

 
cars.forEach(function (brands) { 
 
    brands.models.forEach(function (model) { 
 
     hash[[brands.brand_id, model.model_id].join('|')] = model; 
 
    }); 
 
}); 
 

 
drivers.forEach(function (driver) { 
 
    driver.cars.forEach(function (car) { 
 
     car.name = hash[[car.brand_id, car.model_id].join('|')].name; 
 
    }); 
 
}); 
 

 
console.log(drivers);
.as-console-wrapper { max-height: 100% !important; top: 0; }

0

Eine andere Lösung Array.prototype.reduce zusammen mit einer Hash-Tabelle - siehe Demo unter:

var cars=[{brand:"VW",brand_id:"1",models:[{name:"Golf",model_id:"1"},{name:"Passat",model_id:"2"}]},{brand:"BMW",brand_id:"2",models:[{name:"X3",model_id:"1"},{name:"X5",model_id:"2"}]}]; 
 
var drivers=[{name:"Test Driver",cars:[{brand_id:"1",model_id:"1"},{brand_id:"2",model_id:"1"}]}]; 
 

 
var result = drivers.reduce(function(hash) { 
 

 
    // create a hash table first 
 
    cars.forEach(function(element) { 
 
    element.models.forEach(function(model) { 
 
     hash[element.brand_id + "|" + model.model_id] = model.name; 
 
    }); 
 
    }); 
 

 
    // now reduce it to obtain the result 
 
    return function(prev, curr) { 
 
    curr.cars.forEach(function(element) { 
 
     element.name = hash[element.brand_id + "|" + element.model_id]; 
 
    }); 
 
    prev.push(curr); 
 
    return prev; 
 
    }; 
 
}(Object.create(null)), []); 
 

 
console.log(result);
.as-console-wrapper{top:0;max-height:100%!important;}

+0

@passatgt lassen Sie mich Ihr Feedback zu diesem, danke! – kukkuz

0
drivers.cars.forEach(        
    car =>            
    car.name =          
     cars.find(          
     car2 =>          
      car2.brand_id === car.brand_id    
    ) 
     .models.find(        
      model => 
      model.model_id === car.model_id 
     ).name 
) 

In Englisch:

Setzen Sie den Namen jedes Autos in der Fahrzeugliste im Fahrerobjekt auf das Ergebnis, indem Sie zuerst das Fahrzeug im Fahrzeug mit der richtigen Marke suchen und dann das Modell innerhalb des Fahrzeugs finden, in dem die Modell_ID übereinstimmt und nahm seinen Namen.

Verwandte Themen