Couchdb уменьшить понимание и сумму - PullRequest
4 голосов
/ 31 августа 2011

Я не знаю, действительно ли это сокращено, но вот почему я здесь.

У меня есть это:

"afrikan" ID: f6733302df85ac109397f4b6030005bf [1, 2]

"африканские" ID: f6733302df85ac109397f4b6030006d1 [1, 3]

"Afrikan" ID: f6733302df85ac109397f4b6030012b6 [2, 4]

"китайский" ID: f6733302df85ac109397f4b6030012eb 1

1012* "китайский" ID: f6733302df85ac109397f4b603001d87 1

Я знаю, как рассчитать сумму, если значение не было массивом (как в китайском).Но мне не удается суммировать значения в массиве, и это приводит к следующему: "afrikan" "02,41,31,2"

И еще один вопрос: есть ли способ суммировать всезначения независимо от клавиш?

Просмотр кода:

function(doc) {
  if(doc.food) {
  emit(doc.food, doc.type);
  }
}

Сокращение кода:

function(keys,values,rereduce) 
{

return sum(values);

}

Большое спасибо :)

ОБНОВЛЕНИЕ:

Я нашел ответ для Couchdb.

Вот код:

function(doc) {
if(doc.food) {
if(doc.type.length>1) {
 doc.type.forEach(function(tag) {
emit(doc.food,tag);
});
}else {
emit(doc.food,doc.type);
}
}
}

Уменьшить:

function(keys,values) {
return sum(values);
}

1 Ответ

2 голосов
/ 31 августа 2011

Причина, по которой вы получаете «02,41,31,2», заключается в том, что Javascript преобразует число + массив в строку.Это очень странно, но это правда.

> 0 + [2, 4] + [1, 3] + [1, 2]
'02,41,31,2'

> sum([0, [2, 4], [1, 3], [1, 2]]) // Same result
'02,41,31,2'

Я думаю, вам не нужно беспокоиться о восстановлении.Просто добавьте все значения вместе.Если это массив, добавьте все значения в массив.

function(keys, values, rereduce)
{
  var total = 0;
  var i, j;

  for(i = 0; i < values.length; i++) {
    if(typeof values[i] == "number") {
      total = total + values[i];
    }

    else {
      for(j = 0; j < values[i].length; j++) {
        total = total + values[i][j];
      }
    }
  }
}
...