深度,有条件地合并js对象

时间:2018-04-11 23:27:47

标签: javascript angular typescript ecmascript-6 lodash

我正在尝试有条件地将来自两个http请求的数据合并到一个对象中。请考虑这些对象。

str

如果两个对象之间的vId匹配,我想将pDetails对象推送到vehicles数组中匹配对象的新数组中。我正在使用Angular 5,TS并将Lodash添加到我的项目中。我正忙着讨论如何遍历嵌套数组。我是JS的新手,还不熟悉api。 TS,ES6,Angular或Lodash中是否有可能使这更容易的东西?

这是我到目前为止最接近的地方:

vehicles: [
{
  vId: 1,
  color: 'green',
  passengers: [
    {
      name: 'Joe',
      age: 22
    },
    {
      name: 'Jack',
      age: 32
    }
  ]
}
more vehicles....]



pDetails: [
  {
    vId: 1,
    detail: tall
  },
  {
    vId: 1,
    detail: 'fat'
  },
  { 
    vId 2,
    detail: 'sad'
  } more details.....
]

这成功地遍历了车辆阵列,但我想我想做的是整合每个v.passenger对象,并且每个对pDetails数组进行搜索,复制匹配,推送到临时数组,然后分配给v .passengers。我仍然无法弄清楚如何迭代每辆车的乘客阵列。

1 个答案:

答案 0 :(得分:0)

使用rxjs函数可以帮助您解决这类问题。

以下是使用combineLatest获取详细信息的车辆代码建议(演示代码,未经测试):

// The first observable pushed value would be
// and array of the pushed values by the Observables
combineLatest(this.getVehiclesDetails(),this.getVehicles())
.pipe(
    // Using the returned values, you could transform them to what you want
    map(([vehicules, details]) =>
        // Here we transform our vehicules array to vehiculesWithDetail array
        vehicules.map(vehicule => {
            // We get the detail for the processed vehicule
            const detail = details.find(d => d.vdId == vehicule.vdId);
            // We merge the two objects in one
            return Object.Assign(vehicule, detail);
        })
    )
)