Javascript 对象的DB数组到数组的对象
我正在尝试与RejectionDB合作进行地图还原,例如:Javascript 对象的DB数组到数组的对象,javascript,arrays,rethinkdb,reql,Javascript,Arrays,Rethinkdb,Reql,我正在尝试与RejectionDB合作进行地图还原,例如: [{a:1,b:2},{a:3},{c:4}]到{a:[1,3],“b:[2],“c:[4]} 我已经咨询过了,但这些陈述在ReQL中并不真正起作用,下面是一个例子: r.expr([{"a":1, "b":2}, {"a":3}, {"c":4}]).do(function(user){ var c1 = {}; var keys = ["a", "b", "c"]; user.map(functio
[{a:1,b:2},{a:3},{c:4}]
到{a:[1,3],“b:[2],“c:[4]}
我已经咨询过了,但这些陈述在ReQL中并不真正起作用,下面是一个例子:
r.expr([{"a":1, "b":2}, {"a":3}, {"c":4}]).do(function(user){
var c1 = {};
var keys = ["a", "b", "c"];
user.map(function(itm){
keys.map(function(p){
if(!c1[p]){
c1[p] = [];
};
c1[p] = r.expr(c1[p]).setInsert(itm(p).default("NIL"));
});
return 1
});
return c1
});
但在itm(p)上出现错误:rqlcompiilerror:Variable name未在中找到:
RQLCompiileError:在以下位置找不到变量名:
r({a:1,b:2},{a:3},{c:4}]).do(函数(var_136){return{a:r([]).setInsert(var_137(“a”).default(“NIL”)、b:r([]).setInsert(var_137(“b”).default(“NIL”)、c:r([]).setInsert(var_137(“c”).default(“NIL”))
^^^^^^^
如果有人想知道,这里有答案(或一种方法)
r.expr([{"a":1, "b":2}, {"a":3}, {"c":4}]).do( r.js("(function(input){
var keys=['a','b','c'], output={};
input.forEach(function(e){
for(var p in e){
output[p] = (output[p] || []).concat(e[p]);
} });
return output; })"
))
修改来自
由于它使用了一些高级的ReQL技术,下面是它的分解方式:
- 这是因为reql中的
比常规javascript的()
括号更强大。它将使用该键收集字段的值[]
- 此步骤的输出是一个数组,如
[['a',[1,2]],['b',[3,4]]
[[['a',1],'b',2]]
这样的数组进入对象{a:1,b:2}
,这在这里非常有用您似乎在使用数组
['a','b','c']
来指定返回对象中键的顺序,但javascript对象没有顺序,键可以按任意顺序返回,而不管它们添加的顺序(或字母或数字顺序)。实际上,大多数浏览器都会按照添加对象属性的顺序返回对象属性,但这并不能保证,而且在某些情况下在某些浏览器中是不一致的,不能依赖。@RobG谢谢。我不认为我对顺序很挑剔,只知道将[{}转换为{[]}的机制.我对代码进行了更多的提炼,在ReQL中发现了一个看起来像bug的东西,我已经提交了Cool,正如您所知…:-)
var input = r.expr([{"a":1}, {"a":3}, {b: 2}, {"a":4}, {b: 3}]);
var keys = input.map(function(x){return x.keys()})
.reduce(function(l, r){return l.setUnion(r)});
.map(function(key){ return [key, input(key)]})
.coerceTo('object');