[英]Reduce function doesn't seem to work properly
我正在使用下面的功能从类型检查的所有文档中提取并创建问题对象:
function (doc) {
if(doc.doctype === "inspection"){
for(var i=0; i<doc.issues.length; i++) {
emit(doc.issues[i].id, {id: doc.issues[i].id, status: doc.issues[i].status, date: doc.date});
}
}
}
我将每个问题的id属性用作键,以便以后可以按问题筛选结果。 这可以正常工作,并针对具有不同日期的同一问题返回4个州,如下所示:
{"total_rows":4,"offset":0,"rows":[
{"id":"31cc62d44e1723f4e39757758101a79a","key":"31cc62d44e1723f4e397577581019612","value":
{"id":"31cc62d44e1723f4e397577581019612","status":"pending","date":"2015-09-02"}},
{"id":"31cc62d44e1723f4e39757758101f808","key":"31cc62d44e1723f4e397577581019612","value": {"id":"31cc62d44e1723f4e397577581019612","status":"pending","date":"2015-09-16"}},
{"id":"31cc62d44e1723f4e39757758102f70e","key":"31cc62d44e1723f4e397577581019612","value": {"id":"31cc62d44e1723f4e397577581019612","status":"pending","date":"2015-11-01"}},
{"id":"31cc62d44e1723f4e397577581033cab","key":"31cc62d44e1723f4e397577581019612","value": {"id":"31cc62d44e1723f4e397577581019612","status":"cancelled","date":"2015-12-07"}}
]}
问题是我试图运行reduce函数以仅返回最新的问题,并且无法遍历所有值。 尽管我使用以下代码从map函数返回4行,其中reduce函数中values参数的长度超过3行:
function (keys, values, rereduce) {
return values.length
}
{"rows":[
{"key":null,"value":3}
]}
同样,当我尝试返回不变的值以查看正在发生什么时,我注意到两个值已按如下方式分组在一起:
{"rows":[
{"key":null,"value":[
[{"id":"31cc62d44e1723f4e397577581019612","status":"pending","date":"2015-11-01"},
{"id":"31cc62d44e1723f4e397577581019612","status":"pending","date":"2015-09-02"}],
[{"id":"31cc62d44e1723f4e397577581019612","status":"cancelled","date":"2015-12-07"}],
[{"id":"31cc62d44e1723f4e397577581019612","status":"pending","date":"2015-09-16"}]]}
]}
请注意,前两个对象已被分组到一个数组中。
我真的很困惑,我认为这是一个简单的任务,但是我无法弄清楚这里缺少什么。
我试图遍历值参数来比较date属性,但这没有用。 我还使用下面的代码递归搜索id属性,但也失败了:
function (keys, values, rereduce) {
var res = [];
function extractVal(obj) {
if(obj.id) {
res.push(obj.id);
}else {
for(key in obj) {
extractVal(obj[key]);
}
}
}
extractVal(values);
return res;
}
好的,这就是我的想法,如果我错了,请纠正我。
reduce函数在rereduce值= false时运行几次,最后在最后一次rereduce值= true时运行。 因此,如果我只是在rereduce为false的情况下按原样返回values数组,那么在最后一步rereduce = true的情况下,我将获得这些返回数组的数组作为values参数。
因此,要提取map函数中返回的对象,我需要运行嵌套循环,如下所示:
function (keys, values, rereduce) {
var arr=[];
if(rereduce){
for(var i=0; i<values.length; i++) {
for(var j=0; j<values[i].length; j++) {
arr.push(values[i][j]);
}
}
return arr;
} else{
return values;
}
}
最后,除了返回arr参数外,我还将处理它以过滤reduce函数应返回的参数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.