уменьшить массив для удаления повторяющихся записей matchId слева направо - PullRequest
0 голосов
/ 19 апреля 2020

Я отправляю объект в массив, когда пользователь обновляет счет для matchId, я хотел бы, чтобы мой окончательный массив удалил все самые старые дубликаты matchId, поэтому из индекса 0 до конца , есть ли способ?

У меня есть это:

cleanData =
    0: {matchId: "271691", homeTeamScore: "1", awayTeamScore: "1"}
    1: {matchId: "271692", homeTeamScore: "1", awayTeamScore: "1"}
    2: {matchId: "271700", homeTeamScore: "1", awayTeamScore: "1"}
    3: {matchId: "271691", homeTeamScore: "6", awayTeamScore: "6"}
    4: {matchId: "271691", homeTeamScore: "8", awayTeamScore: "8"}
    5: {matchId: "271691", homeTeamScore: "8", awayTeamScore: "8"}
    6: {matchId: "271691", homeTeamScore: "8", awayTeamScore: "0"}

Мне бы хотелось:

0: {matchId: "271692", homeTeamScore: "1", awayTeamScore: "1"}
1: {matchId: "271700", homeTeamScore: "1", awayTeamScore: "1"}
2: {matchId: "271691", homeTeamScore: "8", awayTeamScore: "0"}

Мой код:

saveResult(data: any, pushMatchId: any) {
    if (this.savedResults) {
      let cleanData = this.savedResults.map((item) => {
        return {
          matchId: item.matchId,
          homeTeamScore: item.homeTeamScore,
          awayTeamScore: item.homeTeamScore,
        };
      });
      data.map((item) => {
        cleanData.push(item);
      });
      this.db.collection("users").doc(this.user.uid).update({
        results: cleanData,
      });
    } else {
      this.db.collection("users").doc(this.user.uid).set({
        results: data,
      });
    }

  }

Ответы [ 5 ]

2 голосов
/ 19 апреля 2020

Так как последние объекты в массиве - это те, которые вам нужны, вы можете использовать reduceRight() и просто добавить к конечному результату совпадения, которых еще нет в конечном массиве, что-то вроде:

let matches = [
  { matchId: "271691", homeTeamScore: "1", awayTeamScore: "1" },
  { matchId: "271692", homeTeamScore: "1", awayTeamScore: "1" },
  { matchId: "271700", homeTeamScore: "1", awayTeamScore: "1" },
  { matchId: "271691", homeTeamScore: "6", awayTeamScore: "6" },
  { matchId: "271691", homeTeamScore: "8", awayTeamScore: "8" },
  { matchId: "271691", homeTeamScore: "8", awayTeamScore: "8" },
  { matchId: "271691", homeTeamScore: "8", awayTeamScore: "0" },
];

let result = matches.reduceRight(
  (p, c) => (!p.find((o) => o.matchId === c.matchId) ? [...p, c] : p),
  []
);

console.log(result);

или более оптимизированный подход, сохраняющий последние matchIds на карте:

let matches = [
  { matchId: "271691", homeTeamScore: "1", awayTeamScore: "1" },
  { matchId: "271692", homeTeamScore: "1", awayTeamScore: "1" },
  { matchId: "271700", homeTeamScore: "1", awayTeamScore: "1" },
  { matchId: "271691", homeTeamScore: "6", awayTeamScore: "6" },
  { matchId: "271691", homeTeamScore: "8", awayTeamScore: "8" },
  { matchId: "271691", homeTeamScore: "8", awayTeamScore: "8" },
  { matchId: "271691", homeTeamScore: "8", awayTeamScore: "0" },
];

let matchIds = new Map();
let result = matches.reduceRight((p, c) => {
  if (!matchIds.get(c.matchId)) {
    matchIds.set(c.matchId, true);
    return [...p, c];
  }
  return p;
}, []);

console.log(result);

В случае, если вы хотите заранее проверить, есть ли уже совпадения с определенным идентификатором, и отфильтровать их перед добавлением последнего, вы можете сделать что-то вроде:

let matches = [
  { matchId: "271691", homeTeamScore: "1", awayTeamScore: "1" },
  { matchId: "271692", homeTeamScore: "1", awayTeamScore: "1" },
  { matchId: "271700", homeTeamScore: "1", awayTeamScore: "1" },
];

let addMatch = (match) => {
  matches = matches.filter(({
    matchId
  }) => matchId !== match.matchId);
  return matches.push(match), matches;
};

let latest = { matchId: "271691", homeTeamScore: "6", awayTeamScore: "6" };

addMatch(latest); // Add the latest match, replace if there was already a score

console.log(matches);
1 голос
/ 19 апреля 2020

Удаление дубликатов звучит как решение проблемы после ее возникновения. Почему бы вообще не запретить добавление дубликатов?

Прежде чем добавлять в массив, проверьте, есть ли уже совпадающий идентификатор в массиве, если он отфильтрован, добавьте новые данные. Если нет, добавьте новые данные

0 голосов
/ 19 апреля 2020

, если идея действительно удалить старые баллы, вот решение:

const input = 
      [ { matchId: "271691", homeTeamScore: "1", awayTeamScore: "1" } 
      , { matchId: "271692", homeTeamScore: "1", awayTeamScore: "1" } 
      , { matchId: "271700", homeTeamScore: "1", awayTeamScore: "1" } 
      , { matchId: "271691", homeTeamScore: "6", awayTeamScore: "6" } 
      , { matchId: "271691", homeTeamScore: "8", awayTeamScore: "8" } 
      , { matchId: "271691", homeTeamScore: "8", awayTeamScore: "8" } 
      , { matchId: "271691", homeTeamScore: "8", awayTeamScore: "0" } 
      ] 

let matchList = new Set()
for (let i=input.length;i--;)
  {
  if (matchList.has(input[i].matchId)) { input.splice(i, 1)  }
  else                                 { matchList.add(input[i].matchId) }
  }

console.log( input  )   
0 голосов
/ 19 апреля 2020

Вы можете решить, как это.

data = [
  { matchId: "271692", homeTeamScore: "1", awayTeamScore: "1" },
  { matchId: "271700", homeTeamScore: "1", awayTeamScore: "1" },
  { matchId: "271691", homeTeamScore: "8", awayTeamScore: "0" },
];

function pushToData(data, newObject) {

  for (let i = 0; i < data.length; i++) {
    // debugger;
    if (data[i].matchId === newObject.matchId) {
      data.splice(i, 1);
      data.push(newObject);
      return;
    }
  }
}

console.log(JSON.stringify(data));
pushToData(data, { matchId: "271691", homeTeamScore: "8", awayTeamScore: "999" });
console.log(JSON.stringify(data));
0 голосов
/ 19 апреля 2020

Один из вариантов - создать Set, чтобы отслеживать строки matchId, которые вы видели ранее, перевернуть массив и отфильтровать его в зависимости от того, был ли виден элемент. Это решение работает, только если товары гарантированно заказаны.

const input = [
  {matchId: "271691", homeTeamScore: "1", awayTeamScore: "1"},
  {matchId: "271692", homeTeamScore: "1", awayTeamScore: "1"},
  {matchId: "271700", homeTeamScore: "1", awayTeamScore: "1"},
  {matchId: "271691", homeTeamScore: "6", awayTeamScore: "6"},
  {matchId: "271691", homeTeamScore: "8", awayTeamScore: "8"},
  {matchId: "271691", homeTeamScore: "8", awayTeamScore: "8"},
  {matchId: "271691", homeTeamScore: "8", awayTeamScore: "0"}
];

const exists = new Set();

const unique = [...input].reverse().filter(({matchId}) => {
  if (!exists.has(matchId)) {
    exists.add(matchId);
    return true;
  }
  return false;
})

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