减少功能似乎无法正常工作

时间:2018-01-10 12:04:12

标签: javascript json couchdb

我正在使用以下函数从类型检查的所有文档中提取和创建问题对象:

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;
}

1 个答案:

答案 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函数返回。