Javascript 如何基于引用的值从另一个对象扩展对象?

Javascript 如何基于引用的值从另一个对象扩展对象?,javascript,arrays,object,Javascript,Arrays,Object,我有两个数组,其中每个元素都是一个对象: var cars = [{ brand: "VW", brand_id: "1", models: [ { name: "Golf", model_id: "1" }, { name: "Passat", model_id: "2" } ] }, { brand: "BMW", brand_id: "2", models: [ {

我有两个数组,其中每个元素都是一个对象:

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 drivers = [{
  name: "Test",
  cars: [
    {
      brand_id: "1",
      model_id: "1",
      name: "Golf"
    },
    {
      brand_id: "2",
      model_id: "1",
      name: "X3"
    }
  ]
}]

我的想法是绕着车手走,然后为每个车手绕着车走,然后绕着每辆车走,然后绕。。。这么多的循环。我希望有一个更简单的方法来解决这个问题。

由于数据结构的原因,这里无法避免循环。但是你可以用一种相当干净的方式来做

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”}];
司机。forEach(汽车);
汽车功能(驾驶员){
//将每辆车映射到按品牌ID筛选的汽车品牌列表
//然后根据模型ID生成汽车模型列表
driver.cars=driver.cars.map(car=>{
var carModels=cars.filter(carBrand=>carBrand.brand\u id==car.brand\u id)[0]。模型;
var model=carModels.filter(carModel=>carModel.model_id==car.model_id)[0];
返回对象。分配(汽车、型号);
});
}

控制台日志(驱动程序)
您可以使用两个
forEach()
循环来完成此操作,以循环drivers数组中的每个对象,然后循环当前对象中的cars数组。之后,您可以使用两个
find()
循环在cars数组中查找具有相同
brand\u id
的对象,然后在模型内部查找具有相同
model\u id
的对象并返回
name

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”}];
驱动程序。forEach(函数(e){
e、 汽车.forEach(功能(c){
c、 name=cars.find(函数a){
返回a.brand\u id==c.brand\u id;
}).models.find(函数a){
返回c.model\u id==a.model\u id;
}).姓名
})
})

console.log(drivers)
您可以为汽车使用哈希表,然后分配名称

var汽车=[{品牌:“大众”,品牌id:“1”,车型:[{名称:“高尔夫”,车型id:“1”},{名称:“帕萨特”,车型id:“2”},{品牌:“宝马”,品牌id:“2”,车型:[{名称:“X3”,车型id:“1”},{名称:“X5”,车型id:“2”}],
驾驶员=[{name:“测试驾驶员”,汽车:[{brand_id:“1”,model_id:“1”},{brand_id:“2”,model_id:“1”}],
hash=Object.create(null);
汽车.forEach(功能(品牌){
品牌.型号.forEach(功能(型号){
散列[[brands.brand_id,model.model_id].join(“|”)]=model;
});
});
驱动程序。forEach(函数(驱动程序){
驾驶员。汽车。forEach(功能(汽车){
car.name=hash[[car.brand_id,car.model_id].join(“|”)].name;
});
});
控制台日志(驱动程序)

.as控制台包装{max height:100%!important;top:0;}
另一个使用
Array.prototype.reduce
和哈希表的解决方案-请参阅下面的演示:

var汽车=[{品牌:“大众”,品牌id:“1”,车型:[{名称:“高尔夫”,车型id:“1”},{名称:“帕萨特”,车型id:“2”},{品牌:“宝马”,品牌id:“2”,车型:[{名称:“X3”,车型id:“1”},{名称:“X5”,车型id:“2”}];
var驱动程序=[{name:“Test Driver”,汽车:[{brand_id:“1”,model_id:“1”},{brand_id:“2”,model_id:“1”}];
var result=drivers.reduce(函数(散列){
//首先创建一个哈希表
汽车.forEach(功能(元件){
element.models.forEach(函数(模型){
散列[element.brand_id+“|”+model.model_id]=model.name;
});
});
//现在减少它以获得结果
返回函数(上一个、当前){
当前车辆forEach(功能(元素){
element.name=hash[element.brand_id+“|”+element.model_id];
});
上推(当前);
返回上一个;
};
}(Object.create(null)),[]);
控制台日志(结果)
.as控制台包装{top:0;最大高度:100%!重要;}
英文:

将drivers对象中cars列表中的每辆车的名称设置为:首先在cars对象中查找具有正确品牌的车,然后在该车中找到与model_id匹配的车型,并取其名称


谢谢数据结构实际上是完全不同的(在内容上),只是尝试将其简化为一个示例和二手车/品牌/型号。现在不再使用
过滤器
并获取结果的第一个元素,而使用
查找
通常更可取。@passatgt让我知道您对此的反馈,谢谢!
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
)