如何根据引用的值从另一个对象扩展对象?

时间:2016-11-02 19:41:46

标签: 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: [
    {
      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"
    }
  ]
}]

将模型的名称复制到每个驱动程序的car对象中的最佳方法是什么?这是预期的结果:

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

我的想法是循环通过驱动程序,然后循环通过汽车为每个驱动程序,然后循环通过每个汽车,然后循环...这么多循环。我希望有一种更容易解决这个问题的方法。

5 个答案:

答案 0 :(得分:0)

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

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

老实说,这种数据结构似乎不必要地复杂。为什么cars是品牌列表,每个品牌都有模型列表?为什么不让cars数组看起来像driver.cars数组,只是一个平面列表,其中每个对象都有品牌和型号?这将使搜索汽车结构变得更加容易。 ModelID在品牌中也应该是唯一的,因此您只需检查型号ID,并知道如果型号相同,品牌必须相同。

答案 1 :(得分:0)

您可以使用两个forEach()循环执行此操作,以循环驱动程序数组中的每个对象,然后循环当前对象中的汽车数组。之后,您可以使用两个find()循环来查找具有相同brand_id的汽车数组中的对象,然后在内部模型中查找具有相同model_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"}]}];

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)




答案 2 :(得分:0)

您可以为汽车使用哈希表,稍后再分配名称。



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




答案 3 :(得分:0)

使用Array.prototype.reduce和哈希表的另一种解决方案 - 请参阅下面的演示:

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

答案 4 :(得分:0)

import requests

url = 'https://stackoverflow.com/questions/40394209/python-requests-how-to-get-a-page-without-downloading-all-images'

# This will yield only the HTML code
response = requests.get(url)

print(response.text)

英文:

  

将驱动程序对象中汽车列表中每辆汽车的名称设置为首先使用正确的品牌在汽车对象中查找汽车的结果,然后在该汽车中找到model_id匹配的模型,并采取它的名字。