比较两个对象以获得匹配的元素

时间:2019-10-07 16:30:33

标签: javascript

我正在比较两个具有相同结构的不同对象:

对象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,然后检查每个索引的日期是否匹配。但是,当日期不匹配时,我遇到了问题,因此索引不同步。

3 个答案:

答案 0 :(得分:3)

您可以使用Mapmap

  • 使用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)

使用mapfind,如果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);