簡體   English   中英

比較兩個數組並填充缺失值

[英]Comparing two arrays and fill in missing values

我想比較 2 個數組中的日期,並將名稱從匹配日期推送到新數組中。 然后為缺少的日期推“0”。

這是我試過的

 var data = [{ name: 'Amy', date: '2020-01-01' }, { name: 'John', date: '2020-01-02' }, { name: 'Sara', date: '2020-01-04' }]; var fulldate = ['2020-01-01', '2020-01-02', '2020-01-03', '2020-01-04', '2020-01-05']; var newData = []; var len = data.length; for (var i = 0; i < len; i++) { if (data[i].date == fulldate[i]) { newData.push(data[i].name); } else if (data[i].date != fulldate[i]) { newData.push("0") } } console.log(newData);

問題是它在遇到不匹配的日期后停止:

Amy,John,0

這就是我需要的

Amy, John, 0, Sara, 0
  • 在您的代碼中,您使用for-loop基於data可變長度的for-loop ,但結果與fulldate長度相同,因此它將基於fulldate可變長度進行循環。
  • 在循環內部,您比較了fulldate[i] == data[i].date所以只比較了相同的索引。 在循環內部,您需要使用另一個循環來查找匹配日期的索引。

您可以簡單地使用Array.prototype.map函數來代替for循環。 (在 map 函數中,使用Array.prototype.findIndex ,您可以找到匹配的日期索引。)

 var data = [{ name: 'Amy', date: '2020-01-01' }, { name: 'John', date: '2020-01-02' }, { name: 'Sara', date: '2020-01-04' }]; var fulldate = ['2020-01-01', '2020-01-02', '2020-01-03', '2020-01-04', '2020-01-05']; const result = fulldate.map((date) => { const existed = data.findIndex(item => item.date === date); return existed >= 0 ? data[existed].name : 0 }); console.log(result);

 var data = [{ name: 'Amy', date: '2020-01-01' }, { name: 'John', date: '2020-01-02' }, { name: 'Sara', date: '2020-01-04' }]; var fulldate = [ '2020-01-01', '2020-01-02', '2020-01-03', '2020-01-04', '2020-01-05' ]; var newData = []; for(var i = 0; i < fulldate.length; i++) { var found = false; for(var k in data) { if(data[k].date == fulldate[i]) { newData.push(data[k].name); found = true; break; } } if(!found) newData.push("0"); } console.log(newData);

最好的方法是始終使用mapfilter fulldate上使用 map 函數obj過濾掉與當前el值具有相同日期的對象(如果存在)。 我在 return 語句中使用了三元運算符,如果對象存在則返回名稱,否則返回 0。

 var data = [{ name: 'Amy', date: '2020-01-01' }, { name: 'John', date: '2020-01-02' }, { name: 'Sara', date: '2020-01-04' }]; var fulldate = ['2020-01-01', '2020-01-02', '2020-01-03', '2020-01-04', '2020-01-05']; var result = fulldate.map((el) => { let obj = data.filter(item => (item.date == el)) return (obj[0]) ? obj[0].name : 0; }) console.log(result);

假設數組已經按日期排序,使用變量dataIdx來迭代dataArray.map()來簡化 for 循環。

 var data = [{name:'Amy', date:'2020-01-01'}, {name:'John', date:'2020-01-02'}, {name:'Sara', date:'2020-01-04'}]; var fulldate = ['2020-01-01', '2020-01-02', '2020-01-03', '2020-01-04', '2020-01-05']; var dataIdx = 0; var newData = fulldate.map(date => data[dataIdx] && data[dataIdx].date == date ? data[dataIdx++].name : '0'); console.log(newData);

對於變量聲明,使用 'let' 或 'const' 而不是 var。 原因: var vs let vs const

而且,您正在尋找的結果可以使用 map & find js func 來完成。

 const fulldate = ["2020-01-01", "2020-01-02", "2020-01-03", "2020-01-04", "2020-01-05"]; const data = [ {name: "Amy", date: "2020-01-01"}, {name: "John", date: "2020-01-02"}, {name: "Sara", date: "2020-01-04"} ]; const result = fulldate.map(date => { const matchingDate = data.find(nameDateObj => nameDateObj['date'] === date); return matchingDate ? matchingDate['name'] : 0; }); console.log(result)

僅供參考:這也可以使用 findIndex 而不是 find 來完成。

fulldate.map(date => {
     const matchingDateIndex = data.findIndex(nameDateObj => nameDateObj['date'] === date);
     return matchingDateIndex > -1 ? data[matchingDateIndex]['name'] : 0; 
});

對於最短的解決方案,您應該結合 map 和 find。 這是一個單線:

 const data = [{ name: 'Amy', date: '2020-01-01' }, { name: 'John', date: '2020-01-02' }, { name: 'Sara', date: '2020-01-04' }]; const fulldate = ['2020-01-01', '2020-01-02', '2020-01-03', '2020-01-04', '2020-01-05']; const result = fulldate.map(x => (data.find(y => y.date === x) || {name: 0}).name) console.log(result)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM