2016-06-21 41 views
0

私はこのようなjson配列を持っています。複雑なjson配列の最小日付と最大日付の検索

var data=[ 
{ 
    Title:"Dummy1", 
    Events:[{ 
    eventName:"StartDate" 
    Date:"Jan-2014" 
    }, 
    { 
    eventName:"EndDate" 
    Date:"Feb-2015" 
    }] 
}, 
{ 
    Title:"Dummy2", 
    Events:[{ 
    eventName:"StartDate" 
    Date:"Jan-2013" 
    }, 
    { 
    eventName:"EndDate" 
    Date:"Feb-2015" 
    }] 
}, 
{ 
    Title:"Dummy3", 
    Events:[{ 
    eventName:"StartDate" 
    Date:"Feb-2014" 
    }, 
    { 
    eventName:"EndDate" 
    Date:"Mar-2015" 
    }] 
}]; 

日付は日付オブジェクトではないことに注意してください。彼らは文字列です。

私はjavascriptやjqueryのないも罰金であれば、私は角度を使用することを好むので、結果は

MinStartDate:Jan-2013 
MaxEndDate:Mar-2015 

する必要があります開始日の最小値と終了日 の最大値を見つける必要があります。

ありがとうございます。

+2

はSO **私のためのサービス**ライト・コードではありません。少なくともあなたが試したことを投稿してください。 – ayushgp

+2

角度、javascript、jQuery -----あなたは何もしていませんか? – Jai

+0

私は配列内の各オブジェクトの最小値と最大値を見つけることで同じ結果を得ることができます。 Dummy1、Dummy2、Dummy3の場合と同様に、最小値と最大値を見つけて、それらの中で最大値と最小値を見つけました。私は直接データオブジェクトを照会することができません。 – Arya220

答えて

2

私の解決策がありますが、これはちょっとですが、更新プログラムの理解と編集がとても簡単です。 私たちは4-5行でそれを解決できると確信していますが、それはうまくいきます。

まず、月の配列を定義:

var max_end_date = data[0].Events[1].Date; 
var min_start_date = data[0].Events[0].Date; 
:あなたは、アレイ内の最小/最大を検索する必要があるたびに同様

var month = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]; 

を、あなたは最初の値と最小値と最大値を初期化する必要があります

次に、開始日と終了日を比較して年/月を比較すると、次のような結果が得られます。

$.each(data, function(k, v) { 
    var month_min_start_date = min_start_date.split("-")[0]; 
    var year_min_start_date = min_start_date.split("-")[1]; 

    var current_start_date = v.Events[0].Date; 
    var month_current_start_date = current_start_date.split("-")[0]; 
    var year_current_start_date = current_start_date.split("-")[1]; 

    if (year_current_start_date < year_min_start_date 
     || year_current_start_date == year_min_start_date && month.indexOf(month_current_start_date) < month.indexOf(month_min_start_date)) { 
      min_start_date = current_start_date; 
     } 

    var month_max_end_date = max_end_date.split("-")[0]; 
    var year_max_end_date = max_end_date.split("-")[1]; 

    var current_end_date = v.Events[1].Date; 
    var month_current_end_date = current_end_date.split("-")[0]; 
    var year_current_end_date = current_end_date.split("-")[1]; 

    if (year_current_end_date > year_max_end_date 
     || year_current_end_date == year_max_end_date && month.indexOf(month_current_end_date) > month.indexOf(month_max_end_date)) { 
      max_end_date = current_end_date; 
     } 

}) 

あなたがJSFiddle

1

でそれを試すことができますここで私はdataSort()という関数を作成し、データ配列ASCまたはDESC順にソートMath

var data=[ 
 
{ 
 
    Title:"Dummy1", 
 
    Events:[{ 
 
    eventName:"StartDate", 
 
    Date:"Jan-2014" 
 
    }, 
 
    { 
 
    eventName:"EndDate", 
 
    Date:"Feb-2015" 
 
    }] 
 
}, 
 
{ 
 
    Title:"Dummy2", 
 
    Events:[{ 
 
    eventName:"StartDate", 
 
    Date:"Jan-2013" 
 
    }, 
 
    { 
 
    eventName:"EndDate", 
 
    Date:"Feb-2015" 
 
    }] 
 
}, 
 
{ 
 
    Title:"Dummy3", 
 
    Events:[{ 
 
    eventName:"StartDate", 
 
    Date:"Feb-2014" 
 
    }, 
 
    { 
 
    eventName:"EndDate", 
 
    Date:"Mar-2015" 
 
    }] 
 
}]; 
 

 
var startDates = [], 
 
    endDates = []; 
 

 
for (i = 0; i < data.length; i++) { 
 
    startDates.push(Date.parse(data[i].Events[0].Date)); 
 
    endDates.push(Date.parse(data[i].Events[1].Date)); 
 
    
 
} 
 

 
Array.min = function(array){ 
 
return Math.min.apply(Math, array); 
 
}; 
 

 
Array.max = function(array){ 
 
return Math.max.apply(Math, array); 
 
}; 
 

 
// or use a library like Moment.js to format dates 
 
var months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]; 
 

 

 
var minDate = new Date(Array.min(startDates)), 
 
    minDateFormat = months[minDate.getMonth()]+'-'+minDate.getFullYear(); 
 

 
var maxDate = new Date(Array.max(endDates)), 
 
    maxDateFormat = months[maxDate.getMonth()]+'-'+maxDate.getFullYear(); 
 

 

 

 
console.log(minDateFormat); 
 
console.log(maxDateFormat);

0

使用して別のアプローチです。フィールドで配列をソートしたので、最小値または最大値を選択するのは簡単です。

<script> 
var data = [ 
    { 
     Title: "Dummy1", 
     Events: [{ 
      eventName: "StartDate", 
      Date: "Jan-2014" 
     }, 
      { 
       eventName: "EndDate", 
       Date: "Feb-2015" 
      }] 
    }, 
    { 
     Title: "Dummy2", 
     Events: [{ 
      eventName: "StartDate", 
      Date: "Jan-2013" 
     }, 
      { 
       eventName: "EndDate", 
       Date: "Feb-2015" 
      }] 
    }, 
    { 
     Title: "Dummy3", 
     Events: [{ 
      eventName: "StartDate", 
      Date: "Feb-2014" 
     }, 
      { 
       eventName: "EndDate", 
       Date: "Mar-2015" 
      }] 
    }]; 


function dataSort(jsonData, orderBy, order) { 
    var index = 0; // 0 StartDate 
    if (orderBy == 'EndDate') { 
     index = 1; // 1 EndDate 
    } 

    jsonData.sort(function (a, b) { 

     var ad = a.Events[index].Date; 
     ad = ad.replace(new RegExp('-'), '1, ') 
     aStartdate = new Date(Date.parse(ad)); 


     var bd = b.Events[index].Date; 
     bd = bd.replace(new RegExp('-'), '1, ') 
     bStartdate = new Date(Date.parse(bd)); 
     if (order == 'ASC') { 
      return aStartdate - bStartdate; // asc 
     } else { 
      return bStartdate - aStartdate; // desc 
     } 


    }); 

    return jsonData; 
} 


var dataSortByStartDate = dataSort(data, 'StartDate', 'ASC'); 
var MinStartDate = dataSortByStartDate[0].Events[0].Date; 
console.log('MinStartDate: ' + MinStartDate); 

var dataSortByEndDate = dataSort(data, 'EndDate', 'DESC'); 
var MaxEndDate = dataSortByEndDate[0].Events[1].Date; 
console.log('MaxEndDate: ' + MaxEndDate); 

関連する問題