Возвращает массив имен из массива объектов - PullRequest
0 голосов
/ 27 марта 2020

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

** вопрос: **

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

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

Пример ввода:

[
  { winner: 'Alishah', loser: 'Bob',    loser_points: 3 },
  { winner: 'Maria',   loser: 'Xu Jin', loser_points: 1 },
  { winner: 'Elise',   loser: 'Bob',    loser_points: 2 },
  { winner: 'Elise',   loser: 'Maria',  loser_points: 4 },
  { winner: 'Alishah', loser: 'Maria',  loser_points: 2 },
  { winner: 'Maria',   loser: 'Xu Jin', loser_points: 3 },
  { winner: 'Xu Jin',  loser: 'Elise',  loser_points: 2 }
]

Ожидаемый результат:

['Алиша', 'Боб', 'Мария', 'Сюй Цзинь', 'Элиз']]

** Код, который у меня пока есть: **

let data = [
  { winner: 'Alishah', loser: 'Bob',    loser_points: 3 },
  { winner: 'Maria',   loser: 'Xu Jin', loser_points: 1 },
  { winner: 'Elise',   loser: 'Bob',    loser_points: 2 },
  { winner: 'Elise',   loser: 'Maria',  loser_points: 4 },
  { winner: 'Alishah', loser: 'Maria',  loser_points: 2 },
  { winner: 'Maria',   loser: 'Xu Jin', loser_points: 3 },
  { winner: 'Xu Jin',  loser: 'Elise',  loser_points: 2 }
];

   
console.log(main(data));

Ответы [ 7 ]

3 голосов
/ 27 марта 2020

Вы можете использовать .flatMap() и Set() для этого:

let data = [
  { winner: 'Alishah', loser: 'Bob',    loser_points: 3 },
  { winner: 'Maria',   loser: 'Xu Jin', loser_points: 1 },
  { winner: 'Elise',   loser: 'Bob',    loser_points: 2 },
  { winner: 'Elise',   loser: 'Maria',  loser_points: 4 },
  { winner: 'Alishah', loser: 'Maria',  loser_points: 2 },
  { winner: 'Maria',   loser: 'Xu Jin', loser_points: 3 },
  { winner: 'Xu Jin',  loser: 'Elise',  loser_points: 2 }
];

const res = [...new Set(data.flatMap(x=>[x.winner, x.loser]))]
console.log( res )

Объяснение:

  • Используя метод .flatMap(), мы сначала получим массив массивов. Здесь внутренний массив будет массивом winner & loser имен.
  • Затем мы сгладим массив, чтобы получить один массив имен всех игроков.
  • И, наконец, используя [...new Set(array)], мы получим различные имена в массиве для достижения желаемого результата.
3 голосов
/ 27 марта 2020

Вы можете использовать Array.reduce() и Set для получения имен и для удаления дубликатов

Array.reduce() итерации по массиву , Таким образом, вы можете добавить sh all winner s и loser s к исходному пустому массиву.

Затем вы можете создать новый Set. Таким образом, вы можете удалить дубликаты (поскольку все элементы string). После этого вы можете преобразовать его обратно в массив, используя spread syntax: [...new Set(array)]

const arr = [
  { winner: 'Alishah', loser: 'Bob',    loser_points: 3 },
  { winner: 'Maria',   loser: 'Xu Jin', loser_points: 1 },
  { winner: 'Elise',   loser: 'Bob',    loser_points: 2 },
  { winner: 'Elise',   loser: 'Maria',  loser_points: 4 },
  { winner: 'Alishah', loser: 'Maria',  loser_points: 2 },
  { winner: 'Maria',   loser: 'Xu Jin', loser_points: 3 },
  { winner: 'Xu Jin',  loser: 'Elise',  loser_points: 2 }
]

const names = [...new Set(arr.reduce((acc, cur) => [...acc, cur.winner, cur.loser], []))]

console.log(names)
0 голосов
/ 29 марта 2020

Использование карты и фильтра

let array = [
  { winner: 'Alishah', loser: 'Bob',    loser_points: 3 },
  { winner: 'Maria',   loser: 'Xu Jin', loser_points: 1 },
  { winner: 'Elise',   loser: 'Bob',    loser_points: 2 },
  { winner: 'Elise',   loser: 'Maria',  loser_points: 4 },
  { winner: 'Alishah', loser: 'Maria',  loser_points: 2 },
  { winner: 'Maria',   loser: 'Xu Jin', loser_points: 3 },
  { winner: 'Xu Jin',  loser: 'Elise',  loser_points: 2 }
];

let winners = array.map(i => i.winner).filter((x, i, a) => a.indexOf(x) == i)
console.log(winners);
0 голосов
/ 27 марта 2020
var players = collection.reduce((acc, player) => {
    if(!acc.inStore[player.winner]) {
        acc.players.push(player.winner)
        acc.inStore[player.winner] = true
    }
    if(!acc.inStore[player.loser]) {
        acc.players.push(player.loser)
        acc.inStore[player.loser] = true
    }
    return acc;
}, {players: [], inStore: {}}).players

// ["Alishah", "Bob", "Maria", "Xu Jin", "Elise"]
0 голосов
/ 27 марта 2020

Смотря ваш код и ожидаемый результат, я думаю, вам не хватает pu sh в arr также имя looser. Чтобы исправить это, мой любимый подход - метод reduce массива js:

const arr = outcomes.reduce((completeList,{winner, looser}) => {
    const extraNames = [winner, looser]
        .filter(x => !completeList.includes(x));
    return [
        ...completeList,
        ...extraNames
    ];
}, []);
0 голосов
/ 27 марта 2020

const outcomes = [
  { winner: 'Alishah', loser: 'Bob',    loser_points: 3 },
  { winner: 'Maria',   loser: 'Xu Jin', loser_points: 1 },
  { winner: 'Elise',   loser: 'Bob',    loser_points: 2 },
  { winner: 'Elise',   loser: 'Maria',  loser_points: 4 },
  { winner: 'Alishah', loser: 'Maria',  loser_points: 2 },
  { winner: 'Maria',   loser: 'Xu Jin', loser_points: 3 },
  { winner: 'Xu Jin',  loser: 'Elise',  loser_points: 2 }
];

const result = outcomes.reduce((acc, cur) => {
  if(!acc.includes(cur.winner))
  acc.push(cur.winner);
  if(!acc.includes(cur.loser))
  acc.push(cur.loser);
  return acc;
}, []).join(",");

console.log(result);
0 голосов
/ 27 марта 2020

Использование reduce и includes

console.clear();

"use strict";

const score = [
  { winner: 'Alishah', loser: 'Bob',    loser_points: 3 },
  { winner: 'Maria',   loser: 'Xu Jin', loser_points: 1 },
  { winner: 'Elise',   loser: 'Bob',    loser_points: 2 },
  { winner: 'Elise',   loser: 'Maria',  loser_points: 4 },
  { winner: 'Alishah', loser: 'Maria',  loser_points: 2 },
  { winner: 'Maria',   loser: 'Xu Jin', loser_points: 3 },
  { winner: 'Xu Jin',  loser: 'Elise',  loser_points: 2 }
]

function reduce(coll, {winner, loser}) {
  if (!coll.includes(winner)) {
    coll.push(winner)
  }
  if (!coll.includes(loser)) {
    coll.push(loser)
  }
  return coll;
}

var players = score.reduce(reduce, [])
console.log(players)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...