【问题标题】:merge non matching arrays of objects with ramda将不匹配的对象数组与 ramda 合并
【发布时间】:2020-02-27 04:58:15
【问题描述】:

我正在尝试使用 Ramda 合并两个基于位置的对象数组。考虑到我有如下数组:

const getKeys = [{"name": "id"}, {"name": "temperature"}, {"name": "humidity"}, {"name": "voltage"}, {"name": "upload_time"}]
const getValues = [{data: [1,1,1,1]},{data: [1,2,3,4]},{data: [5,6,7,8]},{data: [1,2,3,4]},{data: [1,2,3,4]}]

我想结束:

[{"name": "id", data: [1,1,1,1]}, {"name": "id", data: [1,2,3,4]}, etc...]

到目前为止,我已经用R.mergeWith 尝试过,但这只会在匹配的键上合并。

【问题讨论】:

  • javascript的map()怎么样?

标签: javascript ramda.js


【解决方案1】:

zip 及其表亲zipWith 设计用于处理具有成对索引的数组。 zip 只会围绕这两个值包装一个数组。 zipWith 接受一个函数,然后用每一对调用该函数。所以,使用merge,我们可以写成zipWith (merge)

const getKeys = [{"name": "id"}, {"name": "temperature"}, {"name": "humidity"}, {"name": "voltage"}, {"name": "upload_time"}]
const getValues = [{data: [1,1,1,1]},{data: [1,2,3,4]},{data: [5,6,7,8]},{data: [1,2,3,4]},{data: [1,2,3,4]}]

console .log (zipWith (merge) (getKeys, getValues))
.as-console-wrapper {max-height: 100% !important; top: 0}
<script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.27.0/ramda.js"></script>
<script> const {zipWith, merge} = R                                  </script>

【讨论】:

    【解决方案2】:
    const mergedObject = getKeys.map((keys, index) => ({
       ...keys,
       data: [...getValues[index].data],
    }))
    

    这会将值添加到键对象

    【讨论】:

    • 我只是修改它以不改变原来的
    • 我认为将data: [...getValues[index].data] 替换为...getValues[index] 会更简洁。这将使用 all 两者的字段,除非它们的键重叠。
    • 但这仍然会包含对 values 数据对象内的数组的引用
    • 如果getValues[index].data 中的元素不是原始元素,那么在原始版本中也会出现类似的情况。如果您想避免任何共享引用,您将需要一个深度克隆。我认为这里没有必要,但 OP 可能会这样做。
    • 我的观点是,如果getValues 的成员中有其他字段,该技术将如何扩展。如果它们已修复,您可以将它们一一添加到您的技术中。我的建议一次处理所有这些。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-21
    • 1970-01-01
    • 2018-04-02
    • 1970-01-01
    • 2015-12-11
    • 2020-08-19
    相关资源
    最近更新 更多