Javascript 对象的DB数组到数组的对象

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

我正在尝试与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(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]]
  • 最后,我们强制一个对象。ReQL可以强制像
    [[['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');