2016-03-28 39 views
-1

私はカスタムのカレンダーのようなものをクライアントに提供していますが、これはデフォルトの動作を受け入れないため、必要な配列をまとめてどのようにまとめていくかという問題を抱えています日付を正しく表示する。日付の複雑な配列操作

いくつかの背景:これはSharePointベースのソリューションで、旅行日と場所を1つのリストに、デフォルトの場所を別のリストに入力します。出力は、その旅行場所のいずれかであるか、またはデフォルト(自宅)の場所であるかに関係なく、任意の日にユーザーの場所を示す4週間の時間帯である必要があります。

旅行リスト([whereabouts])へのREST呼び出し、デフォルトロケーションリスト([defaults])への呼び出し、今日から今日に至る日付の配列を作成するためのコードの他のもの+28([allDates])。

私はループのネストされた束を試しましたが、実際に正しいものを返すわけではありません。しかし、私は基本的に言っておく必要があります:[allDates]の毎日のために、その日付の[whereabouts]にイベントがありますか?その場合は、イベントのタイトルをプッシュします。そうでない場合は、デフォルトの場所を[defaults]からプッシュします。

私はここで完全に失われています、皆さん、何か助けが非常に高く評価されています。ラジェッシュへの答えで

編集

、[所在]イベントの配列は、次のプロパティを持つオブジェクトされています

  • 日(UTC文字列)
  • イベントの長さ(文字列)
  • チームメンバー(文字列)
  • タイトル(文字列)

[allDates]は、今日から今日までの日付文字列の配列+ 28日です。

  • チームメンバー(文字列)
  • 場所(文字列)

そして、私が持っているものの例:

[デフォルト設定]は、次のプロパティを持つオブジェクトの配列です/試行中:

(REST呼び出し後、データを返した後)

function initCal(){ 

    //Groups returned whereabouts data into arrays per team member name. 
    var grouped = _(whereabouts).groupBy(function(o){ 
     return o.Team_x0020_Member.Title; 
    }); 

    //Reduces the above to something a little more simple for me to work with. 
    grouped = _.pairs(grouped)   

    //Full disclosure, this is going into a google charts data table. 
    var tbl = new google.visualization.DataTable(); 

    //Building the allDates array and adding in day names. 
    for(var i=0;i<14;i++){ 
     var weekday = new Array(7); 
     weekday[0]= "Sunday"; 
     weekday[1] = "Monday"; 
     weekday[2] = "Tuesday"; 
     weekday[3] = "Wednesday"; 
     weekday[4] = "Thursday"; 
     weekday[5] = "Friday"; 
     weekday[6] = "Saturday";     
     var day = today.addDays(i); 
     var d = weekday[day.getDay()]; 
     var n = day.toLocaleDateString(); 
     tbl.addColumn('string',n); 
    } 

    //I have to do some manipulation of the object google creates. It looks kind of weird, but the output is that allDates array. 
    var allDates = []; 
    var colsArr = tbl.Kf;    
    for(var i=0;i<colsArr.length;i++){ 
     if(colsArr[i].label != ''){ 
      allDates.push(colsArr[i].label); 
     } 
    } 

    //This is ultimately where the results will go. 
    var rows = []; 

    //Cycle through grouped, get the current team member, then go manipulate all these arrays using getEvents. 
    for(var i=0;i<grouped.length;i++){ 
     var thisTM = grouped[i][0]; 
     var whereabouts = grouped[i][1]; 
     rows.push([thisTM,getEvents(whereabouts,defaults,allDates)]); 
    } 

    //This is just where the data table goes.  
    var table = new google.visualization.Table(document.getElementById('whereabouts')); 
      table.draw(tbl, {width: '100%', height: '100%'});   

} 

//Just needed something to get the day names. Not important, left here because laziness. 
Date.prototype.addDays = function(days){ 
    var dat = new Date(this.valueOf()); 
    dat.setDate(dat.getDate() + days); 
    return dat; 
} 


function getEvents(whereabouts,defaults,allDates){ 
    //Figure I'll put the finished results here and return this array. 
    var events = []; 

    //Empty array for formatted dates. 
    var evDate = []; 

    //Format the whereabouts date strings into locale date strings so I can do comparisons against the allDates date strings. 
    for(var i=0;i<whereabouts.length;i++){ 
     var formatD = new Date(whereabouts[i].Date).toLocaleDateString(); 
      evDate.push(formatD); 
    } 

    for(var i=0;i<allDates.length;i++){ 
     for(var j=0;j<evDate.length;j++){ 
      if (evDate[j] === allDates[i]){ 
       events.push(whereabouts[j].Title); 
      } else { 
       events.push(defaults.Title); 
      } 
     } 
    }  
} 

編集2 もう1つのコンテキスト。 initCalに返されるべきものは、allDaysとまったく同じ長さですが、イベントタイトル(ある場合)またはデフォルトの場所(その日にイベントがない場合)のいずれかを含む配列でなければなりません。

それは意味がありますか?皆様のご支援とご意見をいただき、ありがとうございます。

+1

これらの変数の内容を共有できますか? – Rajesh

+1

私の専門用語ではありませんが、ここにいる人の助けが必要な場合は、既に試したコードをすべて提供することをお勧めします。 –

+0

確かに、すべての良いフィードバック。配列の説明と私が今作業している自己文書化されたコードを追加しました。 – ChrisPEditor

答えて

-1

本当に答えはありますが、コメントは十分に大きくありません。

おそらく "UTC文字列"とは、 "2016-03-29T10:43:23Z"などのようなISO 8601拡張形式の日付を意味します。ほとんどのブラウザは正しく解析するでしょうが、私はそれを自分自身で解析して、それについて確かめることをお勧めします。

日付を一致させたい場合(時間なし)、と同じ形式の文字列を比較するか、それを比較して比較するだけです。時間値を使用する利点は、より大きい値と小さい値を使用することもできます。正午(12:00:00)または深夜(00:00:00)と言うと、時間を共通の値に設定してください。

どちらの方法でも、日付の書式を設定する関数を作成します。

あなたがmoment.jsのようなライブラリを必要としない場合は、多くのフォーマッタとパーサがあります。 Date.formatdate-formatの場合、2番目のパーサーにもパーサがあります。これはプレーンなDateオブジェクトで動作しますが、Moment.jsはDateの周りに独自のラッパーを作成します。