Как я могу получить повторяющиеся объекты из этого массива JSON с помощью JS?

Из приведенного ниже JSON я хотел получить игроков и перечислить их по тому, сколько раз на них ссылаются. Так, например, игрок 3, на «Челси», который упоминается один раз, является лучшим игроком под номером 1, затем Джим, на который ссылаются дважды, будет номером 2, затем первый игрок, Джо, будет последним в списке, потому что он упоминается 3 раза. . Итак, от наименее упоминаемого к наиболее частому.

Я думал сделать это с помощью метода фильтрации массива через JS, но не был уверен, что это сработает? Есть ли способ сравнить один объект в массиве с другим с помощью фильтра?

Я думал, что что-то вроде этого JS ниже, первая часть цикла for, будет сравнивать каждого игрока со следующим в массиве, но это не будет точно сравнивать их, потому что он фильтрует для каждого цикла, так что я изображение разрушит производительность и неточная фильтрация. Вот почему я также включил условие if, я не знал, будет ли это лучше, чем фильтр для этого?

let topPlayers = []
for(let i=0; i<players.length; i++) {
    players.filter((player) => player[i] == player[i + 1])

    if(players[i].title == players[i+1].title) {
        topPlayers.push(players[i])
    }
}
const players = [
 {
    "header": "Player",
    "title": "Player one",
    "subtitles": [
      {
        "name": "Joe"
      }
    ],
    "time": "2016-11-08T16:03:08.957Z",
    "products": [
      "Xbox"
    ]
  },
  {
    "header": "Player",
    "title": "Player two",
    "subtitles": [
      {
        "name": "Jim"
      }
    ],
    "time": "2016-11-08T16:03:08.957Z",
    "products": [
      "Xbox"
    ]
  },
  {
    "header": "Player",
    "title": "Player one",
    "subtitles": [
      {
        "name": "Joe"
      }
    ],
    "time": "2016-11-08T16:03:08.957Z",
    "products": [
      "Xbox"
    ]
  },
  {
    "header": "Player",
    "title": "Player two",
    "subtitles": [
      {
        "name": "Jim"
      }
    ],
    "time": "2016-11-08T16:03:08.957Z",
    "products": [
      "Xbox"
    ]
  },
  {
    "header": "Player",
    "title": "Player three",
    "subtitles": [
      {
        "name": "Chelsea"
      }
    ],
    "time": "2016-11-08T16:03:08.957Z",
    "products": [
      "PC"
    ]
  },
  {
    "header": "Player",
    "title": "Player one",
    "subtitles": [
      {
        "name": "Joe"
      }
    ],
    "time": "2016-11-08T16:03:08.957Z",
    "products": [
      "Xbox"
    ]
  }
]

Когда два игрока считаются равными? Достаточно ли сравнивать title? Или вы хотите сравнивать объекты по стоимости? например. Все свойства/значения точно совпадают.

3limin4t0r 17.05.2022 20:31
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Сравнение структур данных: Массивы и объекты в Javascript
Сравнение структур данных: Массивы и объекты в Javascript
Итак, вы изучили основы JavaScript и хотите перейти к изучению структур данных. Мотивация для изучения/понимания Структур данных может быть разной,...
Создание собственной системы электронной коммерции на базе Keystone.js - настройка среды и базовые модели
Создание собственной системы электронной коммерции на базе Keystone.js - настройка среды и базовые модели
Прошлая статья была первой из цикла статей о создании системы электронной коммерции с использованием Keystone.js, и она была посвящена главным образом...
Приложение для отслеживания бюджета на React js для начинающих
Приложение для отслеживания бюджета на React js для начинающих
Обучение на практике - это проверенная тема для достижения успеха в любой области. Если вы знаете контекст фразы "Практика делает человека...
Стоит ли использовать React в 2022 году?
Стоит ли использовать React в 2022 году?
В 2022 году мы все слышим о трендах фронтенда (React, Vue), но мы не знаем, почему мы должны использовать эти фреймворки, когда их использовать, а...
0
1
30
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

const counter = {};

for(const player in players) {

  // checks whether property named as player already exists
  if(!counter[player.title]) {

     // Create new property, named as player, with 1 as value
     counter[player.title] = 1;

  } else {

     // Increment property value
     counter[player.title]++;
  }

}

for(const player in counter) {
  console.log(`The player ${player} is recorded  ${counter[counter]} times`);
}

Спасибо за ваше решение!

EngineerForFun 18.05.2022 01:53
Ответ принят как подходящий

Один из способов сделать это — использовать комбинацию .reduce(..) и .sort(..).

Вот пример:

const players = [
 {
    "header": "Player",
    "title": "Player one",
    "subtitles": [
      {
        "name": "Joe"
      }
    ],
    "time": "2016-11-08T16:03:08.957Z",
    "products": [
      "Xbox"
    ]
  },
  {
    "header": "Player",
    "title": "Player two",
    "subtitles": [
      {
        "name": "Jim"
      }
    ],
    "time": "2016-11-08T16:03:08.957Z",
    "products": [
      "Xbox"
    ]
  },
  {
    "header": "Player",
    "title": "Player one",
    "subtitles": [
      {
        "name": "Joe"
      }
    ],
    "time": "2016-11-08T16:03:08.957Z",
    "products": [
      "Xbox"
    ]
  },
  {
    "header": "Player",
    "title": "Player two",
    "subtitles": [
      {
        "name": "Jim"
      }
    ],
    "time": "2016-11-08T16:03:08.957Z",
    "products": [
      "Xbox"
    ]
  },
  {
    "header": "Player",
    "title": "Player three",
    "subtitles": [
      {
        "name": "Chelsea"
      }
    ],
    "time": "2016-11-08T16:03:08.957Z",
    "products": [
      "PC"
    ]
  },
  {
    "header": "Player",
    "title": "Player one",
    "subtitles": [
      {
        "name": "Joe"
      }
    ],
    "time": "2016-11-08T16:03:08.957Z",
    "products": [
      "Xbox"
    ]
  }
]

const result = players.reduce((a, c) => {
  const found = a.find((o) => o.title === c.title);
  if (found) {
    found.count++;
    return a;
  }
  a.push({ title: c.title, subtitles: c.subtitles, count: 1 });
  return a;
}, []).sort((a, b) => a.count - b.count);

console.log(result.map((o, i) => `Player: ${o.subtitles[0].name} is #${i+1}`));

Это сначала уменьшает массив до массива, который содержит только уникальные записи (упрощенную версию исходных объектов) и количество вхождений каждого из этих объектов (свойство count). Затем он сортирует массив на основе этого числа.

Итак, я думаю, что это делает то, что я хочу, но не могли бы вы помочь мне немного понять логику? Похоже, что мы используем сокращение для нашего сравнения, мы используем find() для сравнения первого индекса массива со следующим. Но с find o.title всегда один и тот же или он меняется при каждом сравнении? Я новичок в методе поиска. Затем, если мы находим результат, мы увеличиваем значение счетчика нашего вновь созданного ключа счетчика в нашем объекте. Но почему мы возвращаем a после этого? Затем мы помещаем в наш массив каждый объект в массиве, но увеличиваем счетчик, если находим его более одного раза, затем сортируем

EngineerForFun 17.05.2022 21:40

@EngineerForFun Я отредактировал свой ответ, добавив объяснение. Это работает примерно так: a начинается с пустого массива, а c — это элемент из исходного массива (элемент на текущей итерации). Во-первых, я использую .find(..), чтобы увидеть, есть ли элемент с текущим элементом title, уже добавленным в массив результатов (a). Если это так (found не является undefined), я увеличиваю count этого найденного элемента, в противном случае я добавляю новый элемент в массив результатов (a) и устанавливаю его count в 1

Titus 17.05.2022 22:52

Благодарю вас! Я ценю помощь!

EngineerForFun 18.05.2022 01:53

Другие вопросы по теме