如何转换以下内容:
[{
"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响应,我试图转换为有用的东西。在我看来,我需要完成两件事才能实现理智的数据输出目标。
frustration
数组转换为对象,使用name
作为键,value
作为值。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');
答案 0 :(得分:3)
你是正确的。
您可以使用object
从数据的键值列表创建对象。但object
会收到参数列表,而不是数组,因此您需要args
。
frustation
是一个数组,每个文档都是对象,你需要一种方法把它变成一个展平数组的列表,意思是从这个数组
[{key1: val1}, {key2: val2},...]
我们将其转为
[key1, val1, key2, val2,...]
为args
提供object
。这是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"
}
]
希望有所帮助:
答案 1 :(得分:2)
这样的事情应该有效:
.map(function(row) {
return row.pluck('name', 'status').merge(
row('frustration').map(function(x){ return [x['name'], x['value']]; }).coerceTo('object'))
})