2017-05-08 19 views
0

50個以上のオブジェクトを持つ配列が1つあります。この配列は、2つの配列を連結した結果です。この配列の要素はオブジェクトであり、各オブジェクトは、形式の日付文字列とキー「日付」があります。Javascript =>配列要素同士を日付で一致させる

`"2017-03-31T11:30:00.000Z"` 

とテキストとキー「キャプション」を。だから私のような要素を持っている:私はより良い、より深い知っているRubyで

[ 
    {date: "2017-03-31T11:30:00.000Z", caption: "text_1"}, 
    {date: "2016-03-31T11:30:00.000Z", caption: "text_2"}, 
    {date: "2016-03-31T11:30:00.000Z", caption: "text_3"}, 
    {date: "2017-03-31T11:30:00.000Z", caption: "text_4"} 
] 

を、あなたは、配列の要素をマッピングし、新しいものとif文によって、条件リターンを返すことができます。私は、JSのようなものがあるかどうか疑問に思っていました。現在、配列をループして各要素を他の要素にマッチングしていますが、これは最もパフォーマンスの良い方法ではありません。私のような何かをしたいと思います:

let newArray = myArray.map((a,b) => { if (a.date === b.date) { return {text1: a.caption, text2: b.caption}}});

そうだろう結果:

[ 
    {text1: "text_1", text2: "text_4"}, 
    {text1: "text_2", text2: "text_3"} 
] 

はこのようなものは、エレガントなだけでなく、パフォーマンスの何かが存在していますか?

おかげで...

+0

だから、 '<>をクリックします'スニペットエディタを作成し、[mcve]を作成してください。 – mplungjan

+0

var result = array.filter(i => i.date == date); –

+0

条件付きでのみ返ってくるので、 'map()'ではありません。結果の配列は元の長さと同じ長さですが、穴がいっぱいです – charlietfl

答えて

1

あなたの質問への答えは次のとおりです。
いいえ、あなたにエレガントなあなたが(パフォーマンスのわからない)望むようにしたいものを実現するJavaScriptで何の機能はありません。あなたの特定のユースケースでは

、私は単純にそのオブジェクトが配列に変換し、その後、キーとして日付を使用し、異なるキャプションを収集し、新しいオブジェクトを作成します。

const collected = {}; 

myArray.forEach((entry) => { 
    if (entry.date in collected) { 
     collected[entry.date].text2 = entry.caption; 
    } else { 
     collected[entry.date] = { text1: entry.caption }; 
    } 
}); 

const newArray = Object.keys(collected).map(key => collected[key]); 
+0

最後に私はアプローチを変更し、配列を連結しませんでした。私はあなたのアプローチに従って、それを私の使用に少し調整しました、そして、はるかに速いデータ形成で解決しました。素晴らしい提案をありがとう。 –

関連する問題