Получить 1-й экземпляр свойства, используя Reduce и Object.values. - PullRequest
0 голосов
/ 25 мая 2018

Я уменьшаю этот прогноз, чтобы получить один результат, возвращаемый для каждой даты.

Моя функция getForecastForDay работает, за исключением того, что она выбирает последний экземпляр каждой даты.Это проблематично только потому, что последний экземпляр в каждом наборе дат имеет одинаковые значения temp_min и temp_max.

Так что мне нужно захватить первый экземпляр каждой даты вместо последней.Я пытался, но я не понимаю.Как я могу выбрать первый экземпляр каждой даты от снижения?

Примечание. Это измененная версия результатов моего прогноза.В этом примере уже удалено время свойства date и некоторые другие свойства.

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

У меня есть код в ответе: https://repl.it/@portabletomb/FittingRoyalblueParameter

Ответы [ 3 ]

0 голосов
/ 25 мая 2018

Проверьте, имеет ли аккумулятор сначала свойство 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);
0 голосов
/ 25 мая 2018

Предполагая, что данные упорядочены, все, что вам нужно сделать, это игнорировать любые дальнейшие записи с той же датой, т.е.

const getForecastForDay = Object.values(
  forecast.reduce((acc, cur) => {
    if (!acc[cur.date]) {
      acc[cur.date] = cur;
    }
    return acc;
  }, {})
)
0 голосов
/ 25 мая 2018

Перед добавлением следующего объекта проверьте, существует ли уже дата в результатах:

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), {});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...