Найти через массив в поле массива - PullRequest
1 голос
/ 20 мая 2019

Как я могу найти что-то через некоторые массивы, которые также содержат массив?Чтобы быть более точным:

enter image description here

И я хочу вернуться из массива Coachs, идентификатор (внутри Coachs), который соответствует имени пользователя.То, что я пробовал:

  if (!(args['coach'].value === '') && (args['coach'].value !== null)) {
    coachId = this.items.find(x => x.username === args.coach.value).id;
  }

В основном this.items - это то, что я раньше использовал console.log.Теперь это дает мне неопределенное значение.

У кого-то есть исправление для этого?Большое спасибо.

[
   {
      "id":584,
      "name":"Name",
      "coaches":[
         {
            "id":8587,
            "username":"test"
         },
         {
            "id":8589,
            "username":"test1"
         }
      ]
   },
   {
      "id":587,
      "name":"O1",
      "coaches":[

      ]
   }
]

И скажем, я хочу вернуть идентификатор 8587 при поиске имени test.

Ответы [ 4 ]

3 голосов
/ 20 мая 2019

Для поиска нескольких совпадений выполните следующие действия:

const data = [{
    "id": 584,
    "name": "Name",
    "coaches": [{
        "id": 8587,
        "username": "test"
      },
      {
        "id": 8589,
        "username": "test1"
      }
    ]
  },
  {
    "id": 587,
    "name": "O1",
    "coaches": [

    ]
  }
];

const usernameToSearch = 'test1';

const foundCoachIds = data
  .reduce((acc, curr) => {

    // Destructure the coaches property first
    const {
      coaches,
      ...rest
    } = curr;

    // Check if any username matches the coach
    const foundMatches = coaches.filter(x => x.username === usernameToSearch);

    // If there is any found match push into accumulator
    if (foundMatches.length) {
      for (const foundMatch of foundMatches) {
        if (acc.indexOf(foundMatch.id) === -1) {
          acc.push(foundMatch.id);
        }
      }
    }

    return acc;
  }, []);

console.log(foundCoachIds);
3 голосов
/ 20 мая 2019

Объединение map и find:

const array = [
  [{a1: 1},
   {a2: 2}
  ],
  [{a1: 1},
   {a2: 2},
   {a3: 3}]
];

const element = array.map(innerArray => {
  const found = innerArray.find(el => el.a1 === 1);
  if (found) return found.a1;
  return null;
}).find(el => el !== null);

console.log(element) // 1
2 голосов
/ 20 мая 2019
let y = this.items.filter(o => o.coaches.some(e => e.username === 'test'))[0]
            .coaches.filter(e=>e.username === 'test')[0].id;

console.log(y);
2 голосов
/ 20 мая 2019
const data = [
   {
      "id":584,
      "name":"Name",
      "coaches":[
         {
            "id":8587,
            "username":"test"
         },
         {
            "id":8589,
            "username":"test1"
         }
      ]
   },
   {
      "id":587,
      "name":"O1",
      "coaches":[

      ]
   }
];   

Для внешнего удостоверения личности

data.map(it => {return !!it.coaches.find(it2 => it2.username == "test") ? it.id : null}).filter(it=>!!it)

evaluates to [584]

Для внутреннего удостоверения личности (тренеров):

data.map(it => it.coaches.find(it2 => it2.username == "test")).filter(it => !!it).map(it=> it.id) 

returns [8587]

Просто нужно взять первый элемент из них, чтобы получить ответ.

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