2016-04-13 13 views
1

私はこのような配列があります。スプリット配列

var flightPlanCoordinates = [ 
            {lat: 37.772, lng: -122.214, status: 'walking'}, 
            {lat: 36.772, lng: -123.214, status: 'walking'}, 
            {lat: 21.291, lng: -157.821, status: 'automotive'}, 
            {lat: -18.142, lng: 178.431, status: 'automotive'}, 
            {lat: -27.467, lng: 153.027, status: 'walking'} 
            {lat: -26.467, lng: 151.027, status: 'walking'} 
            ]; 

をし、私はこれは、同じタイプなどを持つオブジェクトを持っている3つのアレイに分割することにしたいです

[{lat: 37.772, lng: -122.214, status: 'walking'}, 
{lat: 36.772, lng: -123.214, status: 'walking'}] 

[{lat: 21.291, lng: -157.821, status: 'automotive'}, 
{lat: -18.142, lng: 178.431, status: 'automotive'}] 

[{lat: -27.467, lng: 153.027, status: 'walking'} 
{lat: -26.467, lng: 151.027, status: 'walking'}] 

私は単にこれを処理するためにgroupByを使用できません。

答えて

0

アレイ内の各項目を繰り返し処理して最後のステータス(lastStatus)を記録し、現在のステータス(obj['status'])と比較するだけです。 statuslastStatus != obj['status'])が変更されるたびに、追加する配列のインデックス(bucketIndex)を増やし、アレイ内のその項目(buckets[bucketIndex])を新しい空の配列([])に設定します。その後、状態が再び変わるか、追加する項目がなくなるまで、その配列に項目を追加し始めます(buckets[bucketIndex].push(obj))。ステータスが変更されている場合は、グループの変更にArray#reduce()を使用することができ

var flightPlanCoordinates = [ 
 
    {lat: 37.772, lng: -122.214, status: 'walking'}, 
 
    {lat: 36.772, lng: -123.214, status: 'walking'}, 
 
    {lat: 21.291, lng: -157.821, status: 'automotive'}, 
 
    {lat: -18.142, lng: 178.431, status: 'automotive'}, 
 
    {lat: -27.467, lng: 153.027, status: 'walking'}, 
 
    {lat: -26.467, lng: 151.027, status: 'walking'} 
 
]; 
 

 
var buckets = []; 
 
var lastStatus; 
 
var bucketIndex = -1; 
 
flightPlanCoordinates.forEach(function(obj){ 
 
    if(lastStatus != obj['status']) { 
 
     buckets[++ bucketIndex] = []; 
 
    } 
 
    buckets[bucketIndex].push(obj); 
 
    lastStatus = obj['status']; 
 
}); 
 
console.log(buckets);

+0

応答、結果は次のようであるためにありがとう:[[{ "LAT":37.772、 "LNG": - 122.214、 "ステータス": "ウォーキング"}、{」 「lat」:36.772、「lng」:123.214、「status」:「walking」}、{"lat":27.467、 "lng":153.027、 "status": "walking"}、{"lat": - 「ステータス」:「ウォーキング」}、「{lat」:21.291、「lng」:157.821、「ステータス」:「自動車」}、{"lat": - 18.142、 "lng":151.027、 "lng":178.431、 "status": "automotive"}]]しかし、状態が変わると配列を分割したいと思っています。結果は3つの配列になるはずです。 –

+0

更新された回答をご覧ください。 –

1

var flightPlanCoordinates = [{ lat: 37.772, lng: -122.214, status: 'walking' }, { lat: 36.772, lng: -123.214, status: 'walking' }, { lat: 21.291, lng: -157.821, status: 'automotive' }, { lat: -18.142, lng: 178.431, status: 'automotive' }, { lat: -27.467, lng: 153.027, status: 'walking' }, { lat: -26.467, lng: 151.027, status: 'walking' }], 
 
    grouped = flightPlanCoordinates.reduce(function (r, a, i) { 
 
     if (!i || r[r.length - 1][0].status !== a.status) { 
 
      return r.concat([[a]]); 
 
     } 
 
     r[r.length - 1].push(a); 
 
     return r; 
 
    }, []); 
 

 
document.write('<pre>' + JSON.stringify(grouped, 0, 4) + '</pre>');