ES6 фильтрует все имена в одну функцию - PullRequest
0 голосов
/ 09 ноября 2018

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

Причина этого в том, что я могу использовать переменную в строковом литерале, отображая значение.

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

Любая помощь будет принята с благодарностью.

let stats = [{name: "goals", value: 5},
{name: "losses", value: 20},
{name: "wins", value: 48},
{name: "draws", value: 23},
{name: "fwd_pass", value: 1533},
{name: "goal_assist", value: 2},
{name: "appearances", value: 80},
{name: "mins_played", value: 6953},
{name: "backward_pass", value: 308}]

//const { player , stats } = playerData[0]

const appearances = stats.filter(({name} , i) => {
      return name == "appearances"
});
const goals = stats.filter(({name} , i) => {
      return name == "goals"
});
const assists = stats.filter(({name} , i) => {
      return name == "goal_assist"
});
const mins = stats.filter(({name} , i) => {
      return name == "mins_played"
});
const fwdPass = stats.filter(({name} , i) => {
      return name == "fwd_pass"
});
const backPass = stats.filter(({name} , i) => {
      return name == "backward_pass"
});

Ответы [ 3 ]

0 голосов
/ 09 ноября 2018

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

let stats = [{name: "goals", value: 5},{name: "losses", value: 20},{name: "wins", value: 48},{name: "draws", value: 23},{name: "fwd_pass", value: 1533},{name: "goal_assist", value: 2},{name: "appearances", value: 80},{name: "mins_played", value: 6953},{name: "backward_pass", value: 308}],
    variables = stats.reduce((a, c) => Object.assign(a, {[c.name]: c}), Object.create(null));

console.log(`Access through key: ${variables.fwd_pass.value}`);
0 голосов
/ 09 ноября 2018

Вы можете создать одну функцию, которой вы передаете имя для фильтрации данных:

let stats = [{ name: "goals", value: 5 }, { name: "losses", value: 20 }, { name: "wins", value: 48 }, { name: "draws", value: 23 }, { name: "fwd_pass", value: 1533 }, { name: "goal_assist", value: 2 }, { name: "appearances", value: 80 }, { name: "mins_played", value: 6953 }, { name: "backward_pass", value: 308 } ]

const fnFilter = (name) => stats.find(x => x.name == name)

console.log(fnFilter('appearances'))
console.log(fnFilter('backward_pass'))

Или вы можете создать карту объекта и получить доступ по ключу:

let stats = [{ name: "goals", value: 5 }, { name: "losses", value: 20 }, { name: "wins", value: 48 }, { name: "draws", value: 23 }, { name: "fwd_pass", value: 1533 }, { name: "goal_assist", value: 2 }, { name: "appearances", value: 80 }, { name: "mins_played", value: 6953 }, { name: "backward_pass", value: 308 } ]

const index = stats.reduce((r,c) => (r[c.name] = c, r), {})

console.log(index['appearances'])
console.log(index['backward_pass'])
0 голосов
/ 09 ноября 2018

Код будет намного короче, если вы используете объект и назначаете имена в качестве свойств. Это всегда будет дольше, если вы хотите, чтобы ваши переменные или свойства верблюжьими. Если вы не используете регулярные выражения или строковые манипуляции для динамического преобразования значений вашего имени в camelCase. Но это ненужное растяжение

let stats = [{name: "goals", value: 5},
{name: "losses", value: 20},
{name: "wins", value: 48},
{name: "draws", value: 23},
{name: "fwd_pass", value: 1533},
{name: "goal_assist", value: 2},
{name: "appearances", value: 80},
{name: "mins_played", value: 6953},
{name: "backward_pass", value: 308}]

    //const { player , stats } = playerData[0]

const statsObj = {};
stats.forEach((item) => { statsObj[item.name] = item; } );

console.log(statsObj.wins); //outputs {name: "wins", value: 48}
console.log(statsObj.wins.value); //48
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...