我的对象具有以下结构:
data
如何获得[10, ..., 100]
:[15, ..., 150]
和<div>
的不同列表来处理每个列表?
由于
答案 0 :(得分:1)
如果所有data
都有相同的密钥,我建议使用map-reduce
进程。
.map(function(doc) {
return doc('data').keys().map(function(key) {
return [key, [doc('data')(key)]]
}).coerceTo('object')
})
.reduce(function(left, right) {
return left.keys().map(function(key) {
return [key, left(key).setUnion(right(key))]
})
.coerceTo('object')
})
根据您的数据集,我们有:
r.expr(
[
{
'record': 1,
'tags': [1, 2],
'data': {
'1': 10,
'2': 15
}
},
{
'record': 1,
'tags': [1, 2],
'data': {
'1': 19,
'2': 100
}
},
{
'record': 1,
'tags': [3, 4, 5],
'data': {
'1': 100,
'2': 150
}
}
]
)
.map(function(doc) {
return doc('data').keys().map(function(key) {
return [key, [doc('data')(key)]]
}).coerceTo('object')
})
.reduce(function(left, right) {
return left.keys().map(function(key) {
return [key, left(key).setUnion(right(key))]
})
.coerceTo('object')
})
产生:
{
"1": [10, 19, 100],
"2": [15, 100, 150]
}
答案 1 :(得分:0)
您可以在对象上调用values
以从中获取值数组:https://www.rethinkdb.com/api/javascript/#values
如果并非所有索引都作为键存在,您可以编写类似r.range(obj.keys().max()).map(function(i) { return obj(i.coerceTo('string')).default(nil); })
的内容。
答案 2 :(得分:0)
如果data
字段可以是任何字符串,则可以使用以下内容:
r.db('test')
.table('test')
.getAll(1, {index: 'record'})
.getField('data')
.concatMap(r.row.coerceTo('array'))
.group(r.row(0))
.concatMap([r.row(1)])
.ungroup()
否则,可能会使用mlucy的建议来提高效率。
编辑:在进一步的实验中,我无法让obj.keys()
比group
更快。