javascript - Rethinkdb 将对象数组转换为单个对象

标签 javascript functional-programming rethinkdb nosql

如何转换以下内容:

[{
  "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 响应,我正试图将其转换成有用的东西。在我看来,我需要完成两件事才能达到理智数据输出的最终目标。

  1. 使用 name 作为键,使用 value 作为值,将 frustration 数组转换为一个对象。
  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');

最佳答案

你的方法是正确的。

您可以使用 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"
}
]

希望对您有所帮助:

关于javascript - Rethinkdb 将对象数组转换为单个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32656869/

相关文章:

javascript - 从数组中检索均匀分布的元素数量

javascript - 灯箱图像调整大小错误

Java 8,静态方法与函数

javascript - NodeJS-RethinkDB : Cannot read property 'id' of null

angular - 在 RethinkDB 中通过 Horizo​​nIO 查找记录不返回结果

带有 CSS 的 Javascript 按钮

javascript - RequireJS,jquery 仍未定义

javascript - 你如何柯里化(Currying)任意数量的任何 javascript 函数?

functional-programming - 如何避免使用可变数据结构并使用更多功能方法?

node.js - Rethinkdb 与 Nodejs 和 Expresso