2016-06-23 10 views
0

私のjavascript配列はそうです。日付配列を使用してカウントオブジェクト配列を作成する方法javascript

var datearray = [ 
    "2016-01-13", 
    "2016-01-18", 
    "2016-01-30", 
    "2016-02-13", 
    "2016-02-18", 
    "2016-02-28", 
    "2016-03-13", 
    "2016-03-23", 
    "2016-03-30", 
    "2016-04-13", 
    "2016-04-18", 
    "2016-04-30", 
    "2016-05-13", 
    "2016-05-18", 
    "2016-05-28", 
    "2016-06-13", 
    "2016-06-23", 
    "2016-06-30", 
    "2016-08-22" 
] 

が、私の検索の日付は、私がstartDate上記とendDate間の新しい日付の配列を取得したいstartDate = 2015-12-01;endDate = 2016-09-30;です。この新しい配列は、次のように表示されます。

var newOjArray = [ 
    {"2015-12":"0"}, 
    {"2016-01":"3"}, 
    {"2016-02":"3"}, 
    {"2016-03":"3"}, 
    {"2016-04":"3"}, 
    {"2016-05":"3"}, 
    {"2016-06":"3"}, 
    {"2016-07":"0"}, 
    {"2016-08":"1"}, 
    {"2016-09":"0"} 
]; 

値は、考慮する日付範囲の合計数を意味します。どのように私はそれを作成しました。

+1

これまで何を試みましたか?あなたは少なくとも、日付の範囲内の要素や何かこれを基本的な要素として識別しようとしましたか? –

+0

私は月の特定の年の合計数を取得したい。 – user3807112

+0

私は月配列を生成するのにこれを使いました、var dateStart = moment( "2015-12-01"); var dateEnd =モーメント( "2016-09-30"); var timeValues = []; while(dateEnd> = dateStart){ timeValues.push(dateStart.format( 'YYYY-MM')); dateStart.add(1、 'month'); } – user3807112

答えて

1

完全な提案。グループ化された結果が必要な配列。

function getGroupedData(dates, from, to) { 
 
    function pad(s, n) { return s.toString().length < n ? pad('0' + s, n) : s; } 
 

 
    var temp = Object.create(null), 
 
     result = [], 
 
     fromYear = +from.slice(0, 4), 
 
     fromMonth = +from.slice(5, 7), 
 
     toYear = +to.slice(0, 4), 
 
     toMonth = +to.slice(5, 7), 
 
     o, k; 
 

 
    datearray.forEach(function (d) { 
 
     var k = d.slice(0, 7); 
 
     temp[k] = (temp[k] || 0) + 1; 
 
    }); 
 

 
    while (true) { 
 
     k = pad(fromYear, 4) + '-' + pad(fromMonth, 2); 
 
     o = {}; 
 
     o[k] = (temp[k] || 0).toString(); 
 
     result.push(o); 
 
     if (fromYear === toYear && fromMonth === toMonth) { 
 
      break; 
 
     } 
 
     fromMonth++; 
 
     if (fromMonth > 12) { 
 
      fromMonth = 1; 
 
      fromYear++; 
 
     } 
 
    } 
 
    return result; 
 
} 
 

 
var datearray = ["2016-01-13", "2016-01-18", "2016-01-30", "2016-02-13", "2016-02-18", "2016-02-28", "2016-03-13", "2016-03-23", "2016-03-30", "2016-04-13", "2016-04-18", "2016-04-30", "2016-05-13", "2016-05-18", "2016-05-28", "2016-06-13", "2016-06-23", "2016-06-30", "2016-08-22"]; 
 

 
console.log(getGroupedData(datearray, '2015-12-01', '2016-09-30'));

+0

はい、あなたのソリューションは完全です。 –

0

Array.filterを使用すると、この配列をフィルタリングできます。あなたの特定の日付形式を利用して、我々は単に文字列として日付を比較し、それらを比較するためにlocaleCompare()を使用することができ、任意の日付計算を行う必要はありません。

var datearray = [ 
    "2016-01-13", 
    "2016-01-18", 
    "2016-01-30", 
    "2016-02-13", 
    "2016-02-18", 
    "2016-02-28", 
    "2016-03-13", 
    "2016-03-23", 
    "2016-03-30", 
    "2016-04-13", 
    "2016-04-18", 
    "2016-04-30", 
    "2016-05-13", 
    "2016-05-18", 
    "2016-05-28", 
    "2016-06-13", 
    "2016-06-23", 
    "2016-06-30", 
    "2016-08-22" 
]; 

var startDate = "2015-12-01"; 
var endDate = "2016-01-30"; 

var filteredArray = datearray.filter(function(item){ 
    return item.localeCompare(startDate) > -1 && endDate.localeCompare(item) > -1; 
}); 

console.log(filteredArray); 

を今、あなたはfilteredArrayを持っていて、単純に繰り返すことができますそれを介して1ヶ月に該当する日付の数を数えます。

+0

次の月の範囲を考慮する必要があります。そのため、OPは '{" 2016-09 ":" 0 "}'を期待結果に含めます。 – RomanPerekhrest

+0

@RomanPerekhrest OPで指定されたフィルタリングされた配列をフォーマットする必要があったと思います。 。しかし、これがOPの問題を解決したようです。ありがとう。 –

+0

あなたの答えはOPのために十分だったようです。 – RomanPerekhrest

0

あなたはこれを試すことがあります。

Underscore.jsは、データを操作するために使用されてきました。

var datearray=["2016-01-13","2016-01-18","2016-01-30","2016-02-13","2016-02-18","2016-02-28","2016-03-13","2016-03-23","2016-03-30","2016-04-13","2016-04-18","2016-04-30","2016-05-13","2016-05-18","2016-05-28","2016-06-13","2016-06-23","2016-06-30","2016-08-22"]; 
 

 
var boxingDay = new Date("12/01/2015"); 
 
var nextWeek = new Date("09/30/2016"); 
 

 
function getDates(d1, d2){ 
 
    var oneDay = 24*3600*1000; 
 
    for (var d=[],ms=d1*1,last=d2*1;ms<last;ms+=oneDay){ 
 
var new_Date=new Date(ms); 
 
    d.push(new_Date.getFullYear()+"-"+("0" + (new_Date.getMonth() + 1)).slice(-2)); 
 
    } 
 
    return d; 
 
} 
 

 
var x=[]; 
 
_.each(datearray, function(e){x.push(e.substring(0, 7));}); 
 

 
var z= _.uniq(getDates(boxingDay, nextWeek)); 
 

 
var f=x.concat(_.uniq(getDates(boxingDay, nextWeek))); 
 

 
document.getElementById("xx").innerHTML=JSON.stringify(_.countBy(f));
<script src="http://underscorejs.org/underscore-min.js"></script> 
 

 
<div id="xx"></div>

0

あなたはより多くのES6方法を探している場合、それをチェックアウト:

var dateArray = ["2016-01-13", "2016-01-18", "2016-01-30", "2016-02-13", "2016-02-18", "2016-02-28", "2016-03-13", "2016-03-23", "2016-03-30", "2016-04-13", "2016-04-18", "2016-04-30", "2016-05-13", "2016-05-18", "2016-05-28", "2016-06-13", "2016-06-23", "2016-06-30", "2016-08-22"]; 
 
var group = {}; 
 

 
dateArray.forEach(date => 
 
    group[(date = date.substr(0, 7))] = 
 
    (group[date] || []).concat(date) 
 
); 
 
var result = Object.keys(group) 
 
    .map(date => ({ 
 
    [date]: group[date].length 
 
    })); 
 

 
console.log(result)

をあなたの日付形式が日付配列としてであれば、長さがnoの場合はsubstrを使用するのが最も簡単な方法です定数であれば、スペーサーで分割して最初の2つの値を得ることができます。それは完全に日付文字列の場合は、これから日付を作成し、オブジェクトのキーとしてあなたの希望する文字列に変換することができます。

関連する問題