Javascript цикл вложенного массива и извлекать свойства на основе другого массива - PullRequest
0 голосов
/ 14 мая 2018

У меня есть kids объект, который выглядит следующим образом:

const kids = {
    name: 'john',
    extra: {
        city: 'London',
        hobbies: [
            {
                id: 'football',
                team: 'ABC',
            },
            {
                id: 'basketball',
                team: 'DEF',
            },
        ],
    },
};

, и у меня есть следующий объект, который содержит все виды спорта и дополнительную информацию для каждого.

const sports = [
    {
        name: 'volleyball',
        coach: 'tom',
    },
    {
        name: 'waterpolo',
        coach: 'jack',
    },
    {
        name: 'swimming',
        coach: 'kate',
    },
    {
        name: 'football',
        coach: 'sara',
    },
];

Я хочу получить список всех id s в массиве хобби и просмотреть все спортивные элементы в массиве sports, найти и добавить дополнительное поле к этому объекту available и присвоить значение trueи его соответствующее имя команды тоже, поэтому результат будет выглядеть так:

const result = [
    {
        name: 'volleyball',
        coach: 'tom',
    },
    {
        name: 'waterpolo',
        coach: 'jack',
    },
    {
        name: 'swimming',
        coach: 'kate',
    },
    {
        name: 'football',
        coach: 'sara',
        available: true,   // it exists in kids' hobbies
        team: 'DEF'      // get it from kids' hobbies
    },
];

Кстати, вот моя попытка:

const result = kids.extra.hobbies.map(a => a.id);
for (var key in sports) {
    console.log(sports[key].name);
    const foundIndex = result.indexOf(sports[key].name);
    if ( foundIndex > -1) {
      sports[key].available = true;
    }
}
console.log(sports)

Но это не относится к команде.Как я могу добавить его к вышеуказанному коду?

Ответы [ 2 ]

0 голосов
/ 15 мая 2018

В вашем коде result массив и kids.extra.hobbies имеют одинаковые индексы массива (поскольку один был сопоставлен с другим).Поэтому вы можете искать объект хобби с foundIndex из хобби:

const result = kids.extra.hobbies.map(a => a.id);
for (var key in sports) {
    const foundIndex = result.indexOf(sports[key].name);
    if ( foundIndex > -1) {
      sports[key].available = true;
      // lookup hobby at `foundIndex`
      sports[key].team = kids.extra.hobbies[foundIndex].team;
    }
}
console.log(sports)
0 голосов
/ 14 мая 2018

Используйте .find, чтобы найти соответствующий хобби-объект, а затем извлеките его team, если он существует:

const kids = {name:'john',extra:{city:'London',hobbies:[{id:'football',team:'ABC',},{id:'basketball',team:'DEF',},],},}
const sports = [{name:'volleyball',coach:'tom',},{name:'waterpolo',coach:'jack',},{name:'swimming',coach:'kate',},{name:'football',coach:'sara',},];
const { hobbies } = kids.extra;
const result = sports.map((sportObj) => {
  const foundObj = hobbies.find(({ id }) => id === sportObj.name);
  if (!foundObj) return { ...sportObj };
  return {...sportObj, team: foundObj.team, available: true };
});
console.log(result);

без спреда:

const kids = {name:'john',extra:{city:'London',hobbies:[{id:'football',team:'ABC',},{id:'basketball',team:'DEF',},],},}
const sports = [{name:'volleyball',coach:'tom',},{name:'waterpolo',coach:'jack',},{name:'swimming',coach:'kate',},{name:'football',coach:'sara',},];
const { hobbies } = kids.extra;
const result = sports.map((sportObj) => {
  const foundObj = hobbies.find(({ id }) => id === sportObj.name);
  if (!foundObj) return Object.assign({}, sportObj);
  return Object.assign({}, sportObj, { team: foundObj.team, available: true });
});
console.log(result);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...