Я пытаюсь работать с Rethinkdb на карте, уменьшая что-то вроде: [{"a":1, "b":2}, {"a":3}, {"c":4}]
до {"a":[1,3], "b":[2], "c":[4]}
.
Я уже консультировался с Javascript: как преобразовать массив объектов в объект с отсортированными уникальными массивами? но операторы на самом деле не работают в 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) с ошибкой: RqlCompileError: Variable name not found in:
RqlCompileError: Variable name not found in:
r([{a: 1, b: 2}, {a: 3}, {c: 4}]).do(function(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"))}; })
^^^^^^^
потому что rethinkdb присваивает идентификатор переменной (в данном случае 137) элементу (p), который не объявлен заранее.
Любые идеи, как я могу это сделать?
Спасибо
['a','b','c']
для указания порядка ключей в возвращаемом объекте, но объекты javascript не имеют порядка, ключи могут быть возвращены в любой последовательности независимо от порядка их добавления (или алфавитного или числового порядка ). На практике большинство браузеров будут возвращать свойства объекта в том порядке, в котором они были добавлены, но это не гарантируется и в некоторых случаях несовместимо в некоторых браузерах, и на него нельзя полагаться. - person RobG   schedule 21.03.2015