我正在使用以下函数从类型检查的所有文档中提取和创建问题对象:
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"}]]}
]}
请注意,前两个对象已组合在一个数组中。
我真的很困惑,我认为这是一个简单的任务,但我无法弄清楚我在这里缺少什么..
我试图遍历值param以比较日期属性,但这不起作用。 我还使用下面的代码递归搜索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;
}
答案 0 :(得分:0)
好的,这就是我想出来的,如果我错了,请纠正我。
reduce函数在rereduce值= false时运行几次,最后在rereduce value = true的情况下最后运行。 因此,如果我刚刚返回值数组,因为它处于rereduce为false的情况下,我将获得这些返回数组的数组作为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参数,而是我将处理它来过滤whaterver应该由reduce函数返回。