我正在比较两个具有相同结构的不同对象:
对象1:
[{
"date": "2019-10-07",
"price": "1313.01"
}, {
"date": "2019-10-08",
"price": "1276.21"
}, {
"date": "2019-10-09",
"price": "1257.75"
}]
对象2:
[{
"date": "2019-10-07",
"price": "2000.10"
}, {
"date": "2019-10-09",
"price": "1356.75"
}]
我正在尝试根据日期返回一系列价格。在我的示例中,我试图返回
["2000.10", "1276.21", "1356.75"]
此数组将返回对象2的所有价格。但是,您可以看到对象2不包括日期“ 2019-10-08”,因此我需要从对象中返回该日期的价格。 1.这些对象的长度是动态的,但是对象1总是比对象2长,因为我从对象1中丢失了值。
返回的数组将始终是对象1的大小。我面临的问题是循环遍历并根据索引检查价格。
我的尝试是遍历对象1,然后检查每个索引的日期是否匹配。但是,当日期不匹配时,我遇到了问题,因此索引不同步。
答案 0 :(得分:3)
您可以使用Map
和map
Map
作为键,从第二个数组创建date
Mapper
上有日期可用,请使用Mapper
中的值作为相应的date
,否则使用当前元素的价格
let a = [{"date": "2019-10-07","price": "1313.01"},{"date":"2019-10-08","price": "1276.21"},{"date": "2019-10-09","price": "1257.75"}]
let b = [{ "date": "2019-10-07","price": "2000.10"},{"date": "2019-10-09","price": "1356.75"}]
let mapper = new Map(b.map(({ date, price }) => [date, price]))
let final = a.map(({ date, price }) => {
return mapper.has(date) ? mapper.get(date) : price
})
console.log(final)
答案 1 :(得分:1)
您可以将它们转换为对象,然后合并并接受值:
const toObject = array => Object.fromEntries(
array.map(
({date,price}) => [date, price]
)
);
const prices = Object.values(
Object.assign(
toObject(array1),
toObject(array2)
)
);
您可以使用此方法组合任意数量的数组:
const prices = Object.values(
Object.assign(
...arrays.map(toObject)
)
);
它将始终获取具有相同日期的最后一项。
答案 2 :(得分:0)
使用map
和find
,如果arr2
的查找结果是undefined
,将使用arr1
的值。
const arr1 = [{
"date": "2019-10-07",
"price": "1313.01"
}, {
"date": "2019-10-08",
"price": "1276.21"
}, {
"date": "2019-10-09",
"price": "1257.75"
}];
const arr2 = [{
"date": "2019-10-07",
"price": "2000.10"
}, {
"date": "2019-10-09",
"price": "1356.75"
}];
const result = arr1.map((item) => (arr2.find((item2) => item.date === item2.date) || item).price);