[英]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.