繁体   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