使用reduce和Object.values获取属性的第一个实例

时间:2018-05-24 22:27:40

标签: javascript object

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

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

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

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

ApplicationData.Current.LocalFolder

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

3 个答案:

答案 0 :(得分:2)

检查累加器是否首先具有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);

答案 1 :(得分:1)

在添加下一个对象之前,请检查结果中是否已存在日期:

forecast.reduce((results, next) => {
    if (!results[next.date]) {
        results[next.date] = next;
    }
    return results;
}, {});

“缩小的”:

forecast.reduce((res, next) => res[next.date] ? res : (res[next.date] = next, res), {});

答案 2 :(得分:1)

假设订购了数据,那么您需要做的就是忽略具有相同日期的任何其他记录,即

const getForecastForDay = Object.values(
  forecast.reduce((acc, cur) => {
    if (!acc[cur.date]) {
      acc[cur.date] = cur;
    }
    return acc;
  }, {})
)