【问题标题】:How to merge a gejoson properties with an array based on the same key如何将 gejoson 属性与基于相同键的数组合并
【发布时间】:2022-01-06 04:52:59
【问题描述】:

我有两个长度相同的对象,每个 ID 都有一个公共属性 edge_id。我想将第二个对象添加到第一个对象的属性中。

我有一个 MapLibre 地图,我想添加一些来自 API(第二个对象)的属性。

第一个对象

 [
    {
        "type": "Feature",
        "properties": {
            "edge_id": 67135,
            "color": "#f7fabf"
        },
        "geometry": {
            "type": "Polygon",
            "coordinates": [ ]
        
        }
    },
    {
        "type": "Feature",
        "properties": {
            "edge_id": 15984,
            "color": "#fcd6a4"
        },
        "geometry": {
            "type": "Polygon",
            "coordinates": [ ]
        }
    },
]

第二个对象

[
    {
        "edge_id": 67135,
        "name": "R12",
        "length": 0.14907826598895346,
        "speed": null,
        "lanes": null
    },
    {
        "edge_id": 15984,
        "name": "Pont de Sully",
        "length": 0.01577450403315043,
        "speed": 30,
        "lanes": 2
    },
]

我想要edge_id : 67135 的以下输出:

{
    "type": "Feature",
    "properties": {
        "edge_id": 67135,
        "color": "#f7fabf",
        "name": "R12",
        "length": 0.14907826598895346,
        "speed": null,
        "lanes": null
    },
    "geometry": {
        "type": "Polygon",
        "coordinates": [ ]
    }
},

【问题讨论】:

  • 我不明白你想要什么样的结果,你能用两个对象开始重构你的问题吗?你想要什么样的最终输出
  • @Frenchy,第一个例子是我想要的输出

标签: javascript arrays object


【解决方案1】:

我会先通过edge_id 收集第二个对象的项目,以便我们以后可以在恒定时间内查找它们:

const secondObjectByEdgeId = secondObject.reduce(
  (o, x) => ({ ...o, [x.edge_id]: x }),
  {}
);

然后遍历第一个对象的项目,用我们刚刚在上面收集的内容增强它们的 properties 字段:

const merged = firstObject.map((x) => ({
  ...x,
  properties: {
    ...x.properties,
    ...secondObjectByEdgeId[x.properties.edge_id]
  }
}));

请注意,上述方法将简单地忽略第二个对象中edge_id出现在第一个对象中的任何项目。


依赖副作用的相同算法:

const secondObjectByEdgeId = secondObject.reduce(
  (o, x) => {
    o[x.edge_id] = x;
    return o;
  },
  {}
);

firstObject.forEach((x) => {
  Object.assign(x.properties, secondObjectByEdgeId[x.properties.edge_id]);
});

firstObject 现已直接更新。

【讨论】:

  • @sp00n 非常感谢。它适用于小物体,但不适用于大物体,因为它非常慢
  • @aba2s 复杂性方面,我不确定你会找到更好的算法。如果您想尝试一下,可能对您的情况有所帮助的是依赖副作用而不是每次都重新创建对象?
  • @aba2s 我已经进行了相应的更新以提供一种基于副作用的方法,它可能性能更好,尽管我们在这方面超出了我的 JS 专业知识,所以我无法准确解释为什么一个会比另一个表现更好(仅供参考)。
猜你喜欢
  • 1970-01-01
  • 2014-02-28
  • 1970-01-01
  • 1970-01-01
  • 2020-07-27
  • 2016-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多