首页 > 解决方案 > 使用 reduce 和 Object.values 获取属性的第一个实例

问题描述

我正在减少这个预测,以便为每个日期返回一个结果。

我的 getForecastForDay 函数可以工作,只是它选择每个日期的最后一个实例。这只是有问题的,因为每个日期集中的最后一个实例具有相同的 temp_min 和 temp_max。

所以我需要抓住每个日期的第一个实例而不是最后一个。我试过了,但我不明白。如何从reduce中选择每个日期的第一个实例?

注意:这是我的预测结果的修改版本。在此示例中,日期属性和其他一些属性上的时间已被删除。

const forecast = [
{date: "2018-05-24", temp_min: 49.87, temp_max: 57.1},
{date: "2018-05-24", temp_min: 49.08, temp_max: 53.9},
{date: "2018-05-24", temp_min: 54.52, temp_max: 56.93},
{date: "2018-05-24", temp_min: 61.8, temp_max: 61.8},
{date: "2018-05-24", temp_min: 66.58, temp_max: 66.58},
{date: "2018-05-25", temp_min: 68.64, temp_max: 68.64},
{date: "2018-05-25", temp_min: 66.33, temp_max: 66.33},
{date: "2018-05-25", temp_min: 62.41, temp_max: 62.41},
{date: "2018-05-25", temp_min: 58.97, temp_max: 58.97},
{date: "2018-05-25", temp_min: 55.15, temp_max: 55.15},
{date: "2018-05-25", temp_min: 56.24, temp_max: 56.24},
{date: "2018-05-25", temp_min: 59.29, temp_max: 59.29},
{date: "2018-05-25", temp_min: 65.89, temp_max: 65.89},
{date: "2018-05-26", temp_min: 67.96, temp_max: 67.96},
{date: "2018-05-26", temp_min: 65.05, temp_max: 65.05},
{date: "2018-05-26", temp_min: 59.42, temp_max: 59.42},
{date: "2018-05-26", temp_min: 55.52, temp_max: 55.52},
{date: "2018-05-26", temp_min: 52.17, temp_max: 52.17},
{date: "2018-05-26", temp_min: 53.06, temp_max: 53.06},
{date: "2018-05-26", temp_min: 58.72, temp_max: 58.72},
{date: "2018-05-26", temp_min: 63.51, temp_max: 63.51}
];

const getForecastForDay = 
Object.values(resultsDateMod.reduce((acc,cur)=> Object.assign(acc,{
[cur.date]:cur} ),{}))

const threeDayForecast = getforecastForDay.slice(0,3);
threeDayForecast

我在 repl 中有一个代码: https ://repl.it/@portabletomb/FittingRoyalblueParameter

标签: javascriptobject

解决方案


首先检查累加器是否具有cur.date属性,并且仅assign在缺少日期的情况下 - 这样,您会跳过重复项,而不是重复项覆盖原件。

const forecast=[{date:"2018-05-24",temp_min:49.87,temp_max:57.1},{date:"2018-05-24",temp_min:49.08,temp_max:53.9},{date:"2018-05-24",temp_min:54.52,temp_max:56.93},{date:"2018-05-24",temp_min:61.8,temp_max:61.8},{date:"2018-05-24",temp_min:66.58,temp_max:66.58},{date:"2018-05-25",temp_min:68.64,temp_max:68.64},{date:"2018-05-25",temp_min:66.33,temp_max:66.33},{date:"2018-05-25",temp_min:62.41,temp_max:62.41},{date:"2018-05-25",temp_min:58.97,temp_max:58.97},{date:"2018-05-25",temp_min:55.15,temp_max:55.15},{date:"2018-05-25",temp_min:56.24,temp_max:56.24},{date:"2018-05-25",temp_min:59.29,temp_max:59.29},{date:"2018-05-25",temp_min:65.89,temp_max:65.89},{date:"2018-05-26",temp_min:67.96,temp_max:67.96},{date:"2018-05-26",temp_min:65.05,temp_max:65.05},{date:"2018-05-26",temp_min:59.42,temp_max:59.42},{date:"2018-05-26",temp_min:55.52,temp_max:55.52},{date:"2018-05-26",temp_min:52.17,temp_max:52.17},{date:"2018-05-26",temp_min:53.06,temp_max:53.06},{date:"2018-05-26",temp_min:58.72,temp_max:58.72},{date:"2018-05-26",temp_min:63.51,temp_max:63.51}];
const getForecastForDay = 
  Object.values(forecast.reduce((acc,cur)=> (
    acc[cur.date]
    ? acc
    : { ...acc, [cur.date]: cur }
  ), {}));
const threeDayForecast = getForecastForDay.slice(0,3);
console.log(threeDayForecast);


推荐阅读