2017-08-28 3 views
1
[{date:'2017-8-1'},{date:'2017-8-2'},{date:'2017-8-3'},{date:'2017-8-5'},{date:'2017-8-6'},{date:'2017-8-7'},{date:'2017-8-8'},{date:'2017-8-9'}] 

私は上記のデータを持っていて、最後の2つのアイテムをグループ化し、 '週末'のプロパティを与えようとします。残りは '平日'です。新しいプロパティのオブジェクトのグループの配列

{ 
    weekdays: [{date:'2017-8-1'},{date:'2017-8-2'},{date:'2017-8-3'},{date:'2017-8-5'},{date:'2017-8-6'},{date:'2017-8-7'}], 
    weekends: [{date:'2017-8-8'},{date:'2017-8-9'}] 
} 

あなたは週末の日は、あなたが簡単なsliceで行うことができ、常に入力配列の最後の2つの要素であることを確認するために知っていれば、私は失敗した

data.map((obj, i) => { 

    if(data.length - (i + 1) >= 2) { 
     return { 
      weekdays: { 
       date: moment(obj.date) 
      } 
     } 
    } 

    return { 
     weekends: { 
      date: moment(obj.date) 
     } 
    } 
}) 

答えて

1

あなたは日になります注文わからない場合:あなたはすでにmomenjsを使用しているので、あなたはmomentオブジェクトの配列にあなたの配列を変換することができます

days = [{date:'2017-8-1'},{date:'2017-8-2'},{date:'2017-8-3'},{date:'2017-8-5'},{date:'2017-8-6'},{date:'2017-8-7'},{date:'2017-8-8'},{date:'2017-8-9'}] 
 

 
const isWeekend = day => (
 
    [6, 0].includes(new Date(day.date).getDay()) 
 
); 
 

 
const separate = (days) => { 
 
    const weekends = []; 
 
    const weekdays = []; 
 
    days.forEach((day) => { 
 
    isWeekend(day) ? weekends.push(day) : weekdays.push(day); 
 
    }); 
 
    return { weekends, weekdays }; 
 
}; 
 

 
console.log(separate(days));

1

を持っていました。

var inputArray = [{date:'2017-8-1'},{date:'2017-8-2'},{date:'2017-8-3'},{date:'2017-8-5'},{date:'2017-8-6'},{date:'2017-8-7'},{date:'2017-8-8'},{date:'2017-8-9'}], 
 
outputArray = { 
 
    weekdays: inputArray.slice(0,5), 
 
    weekends: inputArray.slice(6) 
 
}; 
 

 
console.log(outputArray);

0

あなたは日付に文字列を変換し、それが何であるかをチェックするために一日.getDay()メソッドを使用することができます。そして、ちょうどこのように対応する配列にそれを置く:あなたはどちらの変数に戻っても配列を返すされている

var array = [{date:'2017-8-1'},{date:'2017-8-2'},{date:'2017-8-3'},{date:'2017-8-5'},{date:'2017-8-6'},{date:'2017-8-7'},{date:'2017-8-8'},{date:'2017-8-9'}]; 
 
var obj = { 
 
    weekdays: [], 
 
    weekends: [] 
 
}; 
 

 
array.forEach((el, key) => { 
 
    if(new Date(el.date).getDay() === 0 || new Date(el.date).getDay() === 6) obj.weekends.push(el); else obj.weekdays.push(el); 
 
}); 
 

 
console.log(obj);

0

。 foreachを使用して、プロパティに変数を追加してみてください。

現在のソリューションではなく、これを試してみてください。

newOb = {}; 
Array.forEach((o,i)=>{ 
If(i>(array.length-2)-1){ 
newOb.weekend == undefined? newOb.weekend=[o]:newOb.weekend.push(o);} 
else{ 
newOb.weekday == undefined? newOb.weekday = [o]: newOb.weekday.push(o);}}); 
+3

回答は良いですが十分ではなく、コードサンプルを投稿してください – iceDragon

0

他の回答に追加して、あなたの試みが失敗した理由を説明する:これはArray.reduceではなくArray.mapの場合です。後者は、入力配列内の各要素に対して1つの要素を返すように設計されていますが、reduceは、配列を単一の値、オブジェクトまたは他のもの(これが必要なもの)に「折りたたむ」ために使用できます。

エレガントな解決策は、次のようになります。上記のコードで

const outObj = inArr.reduce(function(obj, current, i) { 
    if(i >= 5) { // or other check for weekend, depending on your data 
     return Object.assign(obj, { weekends : obj.weekends.push(current) }) 
    } else { 
     return Object.assign(obj, { weekdays : obj.weekdays.push(current) }) 
    } 
    }, { weekdays : [], weekends : [] }) 

、我々はmapと同じように、各入力要素上で実行されて渡す機能を。重要な違いは、最初のパラメータ(この例ではobjと呼ばれます)として渡される関数の最後の実行によって生成された出力にアクセスできることです。ちなみにreduceに渡される2番目のパラメータは、初期状態はobj(2つの空のリストを持つオブジェクト)です。

mapのように、n異なるものを作成するのではなく、1つのオブジェクトを徐々に埋めることができます。

0

map()を使用し、次にを使用してisoWeekday() methodを使用して:

var array = [{date:'2017-8-1'},{date:'2017-8-2'},{date:'2017-8-3'},{date:'2017-8-5'},{date:'2017-8-6'},{date:'2017-8-7'},{date:'2017-8-8'},{date:'2017-8-9'}]; 
 

 
var momentArray = array.map(function(d){ return moment(d.date, "YYYY-M-D"); }); 
 

 
var obj = { 
 
    weekdays: momentArray.filter(function(d){ return d.isoWeekday() < 6 }), 
 
    weekends: momentArray.filter(function(d){ return d.isoWeekday() > 5 }) 
 
}; 
 

 
console.log(obj);
<script src="//cdnjs.cloudflare.com/ajax/libs/moment.js/2.18.1/moment.min.js"></script>

関連する問題