Фильтровать массив на основе подмассива свойств объектов

#javascript #jquery

#javascript #jquery

Вопрос:

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

 var staff = [];
staff.push({
    Id: 122,
    Events: [
        {Id: 30,Name: "Foo"},
        {Id: 57,Name: "Bar"}
    ]});
staff.push({
    Id: 122,
    Events: [
        {Id: 57,Name: "Bar"}
    ]});
    
 

До сих пор я пробовал варианты следующего:

 $.grep(staff, function (item) {
    return item.Events.Id == 30
});
 

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

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

 var staff = [{Id: 122, Events: [{Id: 30,Name: "Foo"},{Id: 57,Name: "Bar"}]}];
 

Ответ №1:

 var staff = [];
staff.push({
  Id: 122,
  Events: [
    { Id: 30, Name: 'Foo' },
    { Id: 57, Name: 'Bar' }
  ]
});
staff.push({
  Id: 122,
  Events: [{ Id: 57, Name: 'Bar' }]
});

const res = staff.filter((item) => item.Events.some((e) => e.Id === 30));
console.log(res); 

Комментарии:

1. отлично, спасибо, имеет смысл фильтровать внутренний объект так же, как и внешний

2. staff.filter(item => item.Events.some(e => e.Id === 30)) здесь было бы намного лучше, так как оно вернулось бы раньше, если будет найдено совпадение.