2016-07-19 6 views
0

同じくチャンクされた日付とそれらの日付に関する日数の配列を返す関数を作成しようとしています。それらの日の残りの部分がある場合、次のように配列に追加されます。期待数値を等しいチャンクに分割する

結果:以下

[{ 
'startDate' : 20160719 //dates generated from momentjs 
'numOfDays': 5 
},{ 
'startDate' : 20160724 
'numOfDays': 5 
},{ 
'startDate' : 20160729 
'numOfDays': 3 
}] 

開始日(momentjs)、日数の合計数(daysToDisplay)と分割される日数に渡すことができている私が書いた関数でありますby(numOfDays)

function buildQueue(startDate, numOfDays, daysToDisplay) { 
    if (!startDate || !numOfDays || !daysToDisplay) { 
     throw new Error('All params required!'); 
    } 

    var num = numOfDays > daysToDisplay ? daysToDisplay : numOfDays; 
    var div = Math.floor(daysToDisplay/num); 
    var count = daysToDisplay; 
    var rem = daysToDisplay % num; 
    var lastItem; 
    var i; 
    var arr = []; 

    for (i = 0; i <= daysToDisplay; i += num) { 

     arr.push({ 
      startDate: moment(startDate, 'YYYYMMDD').add(i, 'days').format('YYYYMMDD'), 
      numOfDays: numOfDays, 
      count: i 
     }) 

     if (rem === count) { 
      break; 
     } 

     count -= num; 

    } 

    if (count > 0) { 
     lastItem = arr[arr.length - 1]; 
     var leftover = daysToDisplay - lastItem.count; 
     arr.push({ 
      startDate: moment(lastItem.startDate, 'YYYYMMDD').add(num, 'days').format('YYYYMMDD'), 
      numOfDays: rem, 
      count: leftover + lastItem.count 
     }); 
    } 

    return arr; 

} 

実施例は、ここ(https://jsfiddle.net/zv5ghqpa/1/)です。このコードは、daysToDisplayが2以上に分割可能なシナリオで動作するように見えます。

daysToDisplayは1で割り切れるだけで、forループのインデックスがゼロであるため、戻り値の配列に追加項目が追加されます。私はbuildQueueを呼び出す場合、予想される結果は( '20160719'、5、8)は次のようになります。

[{ 
    'startDate': 20160719 
    'numOfDays': 5 
}, { 
    'startDate': 20160724 
    'numOfDays': 3  
}] 

代わりにその返却:私は、私は十分な情報を与えてくれた期待し

[{ 
    'startDate': 20160719 
    'numOfDays': 5 
},{ 
    'startDate': 20160724 
    'numOfDays': 5 
}, { 
    'startDate': 20160729 
    'numOfDays': 3  
}] 

...これがあります実際に私の頭の中でやっている。

ありがとうございます!

答えて

0

私は、これはあなたが探しているコードだと思う:

function buildQueue(startDate, numOfDays, daysToDisplay) { 

    if (!startDate || !numOfDays || !daysToDisplay) { 
    throw new Error('All params required!'); 
    } 

    var num = numOfDays > daysToDisplay ? daysToDisplay : numOfDays; 
    var div = Math.floor(daysToDisplay/num); 
    var count = daysToDisplay; 
    var rem = daysToDisplay % num; 
    var n = 0; 
    var i; 

    var arr = []; 

    for (i = 0; i <= daysToDisplay; i += num) { 

    arr.push({ 
     startDate: moment(startDate, 'YYYYMMDD').add(i, 'days').format('YYYYMMDD'), 
     numOfDays: daysToDisplay % num, 
     count: i 
    }) 

    console.log(rem + ' ' + count); 

    if (rem === count) { 
     count = 0; 
     break; 
    } 

    count -= num; 

    } 

    if (count > 0) { 
    var leftover = daysToDisplay - arr[arr.length - 1].count; 
    arr.push({ 
     startDate: moment(arr[arr.length - 1].startDate, 'YYYYMMDD').add(num, 'days').format('YYYYMMDD'), 
     numOfDays: daysToDisplay % num, 
     count: leftover + arr[arr.length - 1].count 
    }); 
    } 

    return arr; 

} 

//console.log(buildQueue(moment(), 80, 100)); 
console.log(buildQueue(moment(), 5, 8)); 
//console.log(buildQueue(moment(), 15, 100)); 
//console.log(buildQueue(moment(), 30, 100)); 
//console.log(buildQueue(moment(), 45, 100)); 
0

私はあなたが質問を編集した前に、「期待される結果は」正しかったと思います。私はまた、サンプルコードは、あなたが出力にしたくないcountプロパティを生成したことに注意してください。

おそらく、このコードはあなたが望むことをしますか?

function buildQueue(startDate, numOfDays, daysToDisplay) { 
    var arr = [] 
    while (daysToDisplay > 0) { 
     arr.push({ 
      startDate: moment(startDate, 'YYYYMMDD') 
         .add(numOfDays * arr.length, 'days') 
         .format('YYYYMMDD'), 
      numDays: Math.min(numOfDays, daysToDisplay) 
     }) 
     daysToDisplay -= numOfDays 
    } 
    return arr 
} 
関連する問題