Javascript - филтърен масив от обекти въз основа на стойността на ключа, съществуващ в отделен масив

Сравнително нов за Javascript, тъй като работя върху първото си приложение, идвам от R, където въпреки че манипулациите с данни (с dplyr или дори с base R) стават много лесни, но в момента се боря с това. Имам следните данни:

var teamsA = ['team1', 'team2', 'team3'];
var teamsB = ['team4', 'team5', 'team6'];

var teamgroup = A;

var myData = [
    {player: "Joe", team: "team1"},
    {player: "Tom", team: "team3"},
    {player: "Red", team: "team2"},
    {player: "Smi", team: "team5"},
    {player: "Bib", team: "team6"},
    {player: "Cat", team: "team2"},
    {player: "Dan", team: "team3"},
    {player: "Jim", team: "team1"}
]

С показаните данни въпросът е доста прост: бих искал да филтрирам myData въз основа на екипа, съществуващ в който и да е масив, определен от променливата teamgroup. т.е.:

if(teamgroup == "A") { 
    myData.filter(team in teamsA) 
} else {
    myData.filter(team in teamsB)
}

...не съм съвсем сигурен как да го направя с javascript. Предпочитайте да използвате новите неща на ES6. Благодаря!


person Canovice    schedule 18.04.2018    source източник
comment
къде е връзката между A и двете променливи teamsA и teamsB? ранен обект със свойства A и B пасват по-добре за избора за филтриране?   -  person Nina Scholz    schedule 18.04.2018


Отговори (4)


Можете да използвате функция, която взема играчите и масива от отбори и филтрира с Array#includes.

function getTeam(players, teams) {
    return players.filter(({ team }) => teams.includes(team));
}

var teamsA = ['team1', 'team2', 'team3'],
    teamsB = ['team4', 'team5', 'team6'],
    myData = [{ player: "Joe", team: "team1" }, { player: "Tom", team: "team3" }, { player: "Red", team: "team2" }, { player: "Smi", team: "team5" }, { player: "Bib", team: "team6" }, { player: "Cat", team: "team2" }, { player: "Dan", team: "team3" }, { player: "Jim", team: "team1" }];

console.log(getTeam(myData, teamsA));
console.log(getTeam(myData, teamsB));
.as-console-wrapper { max-height: 100% !important; top: 0; }

person Nina Scholz    schedule 18.04.2018

Можете да използвате filter точно както възнамерявате

var teamsA =
  [ 'team1', 'team2', 'team3' ]
  
var teamsB =
  [ 'team4', 'team5', 'team6' ]

var myData =
  [ {player: "Joe", team: "team1"}
  , {player: "Tom", team: "team3"}
  , {player: "Red", team: "team2"}
  , {player: "Smi", team: "team5"}
  , {player: "Bib", team: "team6"}
  , {player: "Cat", team: "team2"}
  , {player: "Dan", team: "team3"}
  , {player: "Jim", team: "team1"}
  ]

const A =
  myData.filter (p => teamsA.includes (p.team))
  
const B =
  myData.filter (p => teamsB.includes (p.team))
  
console.log (A) // Joe Tom Red Cat Dan Jim
console.log (B) // Smi Bib

Въпреки че би било по-добре да се направи функция

const playersForTeams = (players, teams) =>
  players.filter (p => teams.include (p.team))

const A =
  playersForTeams (myData, teamsA)

const B =
  playersForTeams (myData, teamsB)

console.log (A) // Joe Tom Red Cat Dan Jim
console.log (B) // Smi Bib
person Mulan    schedule 18.04.2018
comment
@TheIncorrigible1 благодаря за забележката, ха! Искам да напомня на програмистите кой е шефът: вие, а не вашият език. - person Mulan; 18.04.2018

person    schedule
comment
ще проверя всички решения, но това изглежда особено чисто / това, което търся. - person Canovice; 18.04.2018

person    schedule
comment
в моето приложение React teamgroupA се предава като проп на компонента, който върши тази работа. - person Canovice; 18.04.2018