【问题标题】:Rethinkdb convert an array of objects to a single objectRethinkdb 将对象数组转换为单个对象
【发布时间】:2015-09-18 16:29:44
【问题描述】:

如何转换以下内容:

[{
  "name": "annoying data",
  "status": "evil",
  "frustration": [
   {
      "name": "foo",
      "value": 1
    },
    {
      "name": "bar",
      "value": 2
    },
    {
      "name": "baz",
      "value": 3
    }
  ]
}...]

到这个输出:

[{
  "name": "annoying data",
  "status": "evil",
  "foo": 1,
  "bar": 2,
  "baz": 3
}...]

来自重新思考查询?

我们有一个存储的第三方 API 响应,我正在尝试将其转换为有用的东西。在我看来,要实现健全数据输出的最终目标,我需要完成 2 件事。

  1. frustration 数组转换为对象,使用name 作为键,value 作为值。
  2. 将新转换的frustration对象合并到父对象中。

我对第 2 步有一个可能的解决方案:

.map(function(row) {
    row.pluck('name', 'status').merge(row('frustration'))
})

但我在第一步中毫无进展。任何想法都非常感谢!

当前完整查询(更改名称以保护...我!):

r.db('test').table('evil_things').map(function(row) {
  var x = row('a')('tree')('children')
        .nth(0)('children')
        .nth(0)
        .map(function(x) {
          return x('children');
        })
        .concatMap(function(x) {
          return x.pluck('name', 'value');
        })
  ;

  return {
    'name': row('name'),
    'status': row('status'),
    'frustration': x
  };
}).filter(function(row) {
  return r.expr(['FOO','BAR','BAZ']).contains(row('name').upcase());
})
.orderBy('status');

【问题讨论】:

    标签: javascript functional-programming rethinkdb nosql


    【解决方案1】:

    你的方法是正确的。

    您可以使用 object 从数据的键值列表创建对象。但是object 接收的是参数列表,而不是数组,所以你需要args

    frustation 是一个以每个文档为对象的数组,您需要一种方法将其转换为扁平数组的列表,即从该数组开始

    [{key1: val1}, {key2: val2},...]

    我们把它变成

    [key1, val1, key2, val2,...]

    object 输入args。这是concatMap 的工作。

    让我们试试这个:

    r.expr([{
      "name": "annoying data",
      "status": "evil",
      "frustration": [
        {
          "name": "foo",
          "value": 1
        },
        {
          "name": "bar",
          "value": 2
        },
        {
          "name": "baz",
          "value": 3
        }
      ]
    }])
    .map(function(doc) {
      return doc.pluck("name", "status").merge(
        r.object(r.args(doc('frustration')
         .concatMap(function(frustration) { return [frustration("name"), frustration("value")] })
        ))
      )
    })
    

    结果:

    [
    {
    "bar": 2 ,
    "baz": 3 ,
    "foo": 1 ,
    "name":  "annoying data" ,
    "status":  "evil"
    }
    ]
    

    希望对你有帮助:

    【讨论】:

    • 非常感谢您朝着正确的方向推动。
    • Hey Scull7,您可以在这本书(顺便说一句我的书)上阅读更多相关信息:github.com/kureikain/simplyrethink
    【解决方案2】:

    这样的事情应该可以工作:

    .map(function(row) {
      return row.pluck('name', 'status').merge(
        row('frustration').map(function(x){ return [x['name'], x['value']]; }).coerceTo('object'))
    })
    

    【讨论】:

    • 太棒了!为我节省了很多时间 :) 对于 javascript,它必须是 return [x('name'), x('value')]
    猜你喜欢
    • 2019-02-12
    • 1970-01-01
    • 1970-01-01
    • 2016-10-10
    • 2013-10-20
    • 2022-01-15
    • 2019-05-08
    • 1970-01-01
    相关资源
    最近更新 更多