2017-05-08 36 views
0

我有一個超過50個對象的數組。這個數組是連接兩個數組的結果。此陣列中的元素是對象和每個對象具有鍵「日期」,在格式的日期字符串:Javascript =>按日期將數組元素相互匹配

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

和密鑰「字幕」的文本。所以,我有相同的元素:

[ 
    {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"} 
] 

在Ruby中,我知道更好,更深入,則可以將在數組元素並返回新和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

所以點擊'<>' snippet編輯器並創建[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

最後我改變了我的方法,並沒有連接數組。我遵循你的方法,並對其進行了一些調整,並以更快的數據形式解決了問題。感謝您的好建議。 –