Как отсортировать массив объектов в том же порядке, что и массив id - PullRequest
0 голосов
/ 13 апреля 2020

У меня есть массив объектов игроков, таких как:

    var players = [{
        id: "thisIsID1",
        name: "William",
        otherProps
    },
    {
        id: "thisIsID2",
        name: "Shakespeare",
        otherProps
    },
    {
        id: "thisIsID3",
        name: "Lola",
        otherProps
    }]

И у меня есть и массив их ID, который был перемешан, вот так:

var shuffledIDs = ["thisIsID2", "thisIsID3", "thisIsID1"]

Как я могу Сортируйте players var, чтобы объекты были в том же порядке, что и соответствующие идентификаторы shuffledIDs?

Редактировать: разные имена только для того, чтобы игроки отличались

Ответы [ 4 ]

4 голосов
/ 13 апреля 2020

Если ваши данные короткие, то вы можете отсортировать их с помощью одной строки:

players = shuffledIDs.map(id => players.find(v => v.id == id))

По сути, для каждого идентификатора в shuffledID он находит элемент в players с этим ID и помещает его в правильное место. Однако на это уходит O (n ^ 2) времени, поэтому он может плохо масштабироваться для больших данных. Если вам нужен более быстрый метод, вы можете сохранить объект с идентификаторами:

var ids = {};
players.forEach(v => ids[v.id] = v);
players = shuffledIDs.map(v => ids[v]);
1 голос
/ 13 апреля 2020

Создание объекта с ключами и значениями в качестве индекса из массива случайных чисел. Используйте метод sort и назначьте приоритеты базам выше перетасованных индексов. Таким образом, даже в случае дублирования данных в проигрывателях.

var players = [
  {
    id: "thisIsID1",
    name: "William"
  },
  {
    id: "thisIsID2",
    name: "Shakespeare"
  },
  {
    id: "thisIsID3",
    name: "Lola"
  }
];

const shuffleIds = ["thisIsID2", "thisIsID3", "thisIsID1"];

const shuf_idx = Object.fromEntries(shuffleIds.map((x, i) => [x, i]));

players.sort((a, b) => shuf_idx[a.id] - shuf_idx[b.id]);

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

Вы можете достичь этого, используя массив .find(), метод:

var players = [{
        id: "thisIsID1",
        name: "William"
    },
    {
        id: "thisIsID2",
        name: "Shakespeare"
    },
    {
        id: "thisIsID3",
        name: "Lola"
    }]

var shuffledIDs = ["thisIsID2", "thisIsID3", "thisIsID1"]
var result = shuffledIDs.map(x => players.find(p=>p.id === x))
console.log(result)
0 голосов
/ 13 апреля 2020

С .map() и .find(), где используется индекс элемента:

const shuffledIDs = ["thisIsID2", "thisIsID3", "thisIsID1"];
const players = [{ id: "thisIsID1", name: "William" }, { id: "thisIsID2",       name: "Shakespeare" }, { id: "thisIsID3", name: "Lola" }];

const result = players.map((e, i) => players.find(f => f.id === shuffledIDs[i]));

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