Фильтр и карта и сохранить оригинал - PullRequest
2 голосов
/ 02 февраля 2020

У меня следующая структура:

this.pronos = [{
    "id": 1,
    "eventname": "EVENT1",
    "round": "EVENT1-1",
    "factor": 1,
    "matchPassed": 10,
    "matchs": [{
        "eq1": "EQ1",
        "eq2": "EQ2",
        "scoreEq1": 0,
        "scoreEq2": 3,
        "passed": true,
        "stats": {
            "domicile": 35.29,
            "exterieur": 35.29,
            "nul": 29.41,
            "boosted": 1
        },
        "date": 20190809,
        "friendlyDate": "Vendredi  9 ao\u00fbt 2019 20:45",
        "pronos": [{
            "matchId": 10,
            "userId": 1,
            "username": "Marcel",
            "points": 0,
            "validation": true,
            "pronoEq1": 1,
            "pronoEq2": 0,
            "booster": 0,
            "MR": 0
        },
        ...
        ]
    },
    ...
    ],
},
    ...
]

Я хотел бы сохранить исходный массив и вернуть этот фильтрованный и сопоставленный массив.

getNextPronos() {
    return this.pronos.filter(event => {
      return event.matchs
        .some(match => {
          return match.date >= this.recentDate;
        });
    })
      .map(event => {
        event.matchs = event.matchs.filter(match => {
          return match.date >= this.recentDate;
        });
        return event;
      }).filter((event) => {
        return event.matchs.length > 0;
      });
  }

Я не хочу объявлять новый массив, потому что this.pronos будет изменен позже.

1 Ответ

0 голосов
/ 02 февраля 2020

Если я правильно вас понимаю, проблема, с которой вы столкнулись на данный момент, заключается в том, что вы изменяете объекты event, но хотите оставить их нетронутыми. Если это так:

getNextPronos() {
    return this.pronos
        // Only events where at least one match is after the date
        .filter(({matchs}) => matchs.some(({date}) => date >= this.recentDate))
        // Map to new event objects with filtered `matchs`
        .map(event => ({
            ...event,
            matchs: event.matchs.filter(({date}) => date >= this.recentDate)
        }));
}

Это делает один частичный l oop через matchs, чтобы увидеть, есть ли какое-либо совпадение после даты, затем второй полный l oop позже, чтобы отфильтровать те, что до Дата. Мне кажется, это нормально. Альтернатива состоит в том, чтобы создать новые объекты событий для всех событий, прежде чем отфильтровать некоторые из них, что выглядит следующим образом:

getNextPronos() {
    return this.pronos
        // Map to new event objects with filtered `matchs`
        .map(event => ({
            ...event,
            matchs: event.matchs.filter(({date}) => date >= this.recentDate)
        }))
        // Filter out the (new) events that have no `matchs`
        .filter(({matchs}) => matchs.length);
}

Примечание: множественное число от «соответствует» равно «соответствует» ( с "е").

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...