[英]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);
最好的方法是始终使用map
和filter
。 在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
来迭代data
和Array.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.