фильтровать массив объектов по массиву значений es6 - PullRequest
0 голосов
/ 27 февраля 2020

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

мой массив с объектами:

const persons = [
  {
    personId: 1,
    name: 'Patrick',
    lastName: 'Smith',
    age: 27,
    allergy: [
    {
      idAllergy: 1,
      name: 'Fish'
    },{
      idAllergy: 2,
      name: 'Nuts'
    }
    ]
  },
  {
    personId: 2,
    name: 'Lara',
    lastName: 'Blake',
    age: 21,
    allergy: [
    {
      idAllergy: 2,
      name: 'Nuts'
    }
    ]
  },
  {
    personId: 3,
    name: 'Erick',
    lastName: 'Robinson',
    age: 30,
    allergy: [
    {
      idAllergy: 3,
      name: 'Flowers'
    }
    ]
  },
  {
    personId: 4,
    name: 'Hilda',
    lastName: 'Vianne',
    age: 35,
    allergy: [
    {
      idAllergy: 4,
      name: 'Chocolat'
    }
    ]
  }

]

мой массив со значениями для фильтрации:

// это idAllergy let аллергия = [2,3]

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

 [{
    personId: 4,
    name: 'Hilda',
    lastName: 'Vianne',
    age: 35,
    allergy: [
    {
      idAllergy: 4,
      name: 'Chocolat'
    }
    ]
  }]

заранее спасибо

Ответы [ 3 ]

1 голос
/ 27 февраля 2020
const filtered = persons.filter(p => !p.allergy.some(a => allergy.includes(a.idAllergy)));

const persons = [
    {
        personId: 1,
        name: 'Patrick',
        lastName: 'Smith',
        age: 27,
        allergy: [
            {
                idAllergy: 1,
                name: 'Fish'
            },{
                idAllergy: 2,
                name: 'Nuts'
            }
        ]
    },
    {
        personId: 2,
        name: 'Lara',
        lastName: 'Blake',
        age: 21,
        allergy: [
            {
                idAllergy: 2,
                name: 'Nuts'
            }
        ]
    },
    {
        personId: 3,
        name: 'Erick',
        lastName: 'Robinson',
        age: 30,
        allergy: [
            {
                idAllergy: 3,
                name: 'Flowers'
            }
        ]
    },
    {
        personId: 4,
        name: 'Hilda',
        lastName: 'Vianne',
        age: 35,
        allergy: [
            {
                idAllergy: 4,
                name: 'Chocolat'
            }
        ]
    }

]


let allergy = [2,3]

const filtered = persons.filter(p => !p.allergy.some(a => allergy.includes(a.idAllergy)));

console.log(filtered);
1 голос
/ 27 февраля 2020

в основном с использованием filter и some сделают свое дело!

const persons = [{
    personId: 1,
    name: 'Patrick',
    lastName: 'Smith',
    age: 27,
    allergy: [{
      idAllergy: 1,
      name: 'Fish'
    }, {
      idAllergy: 2,
      name: 'Nuts'
    }]
  },
  {
    personId: 2,
    name: 'Lara',
    lastName: 'Blake',
    age: 21,
    allergy: [{
      idAllergy: 2,
      name: 'Nuts'
    }]
  },
  {
    personId: 3,
    name: 'Erick',
    lastName: 'Robinson',
    age: 30,
    allergy: [{
      idAllergy: 3,
      name: 'Flowers'
    }]
  },
  {
    personId: 4,
    name: 'Hilda',
    lastName: 'Vianne',
    age: 35,
    allergy: [{
      idAllergy: 4,
      name: 'Chocolat'
    }]
  }

]

const allergies = [2, 3]

const resultWithAllergies = persons.filter(person => {
  const {
    allergy
  } = person;

  const hasAllergy = allergy.some(({
    idAllergy
  }) => allergies.includes(idAllergy))

  return hasAllergy;
})


console.log(resultWithAllergies)

const persons = [{
    personId: 1,
    name: 'Patrick',
    lastName: 'Smith',
    age: 27,
    allergy: [{
      idAllergy: 1,
      name: 'Fish'
    }, {
      idAllergy: 2,
      name: 'Nuts'
    }]
  },
  {
    personId: 2,
    name: 'Lara',
    lastName: 'Blake',
    age: 21,
    allergy: [{
      idAllergy: 2,
      name: 'Nuts'
    }]
  },
  {
    personId: 3,
    name: 'Erick',
    lastName: 'Robinson',
    age: 30,
    allergy: [{
      idAllergy: 3,
      name: 'Flowers'
    }]
  },
  {
    personId: 4,
    name: 'Hilda',
    lastName: 'Vianne',
    age: 35,
    allergy: [{
      idAllergy: 4,
      name: 'Chocolat'
    }]
  }

]

const allergies = [2, 3];

const resultWithoutAllergies = persons.filter(person => {
  const {
    allergy
  } = person;

  const hasAllergy = allergy.some(({
    idAllergy
  }) => !allergies.includes(idAllergy))

  return hasAllergy;
})
console.log(resultWithoutAllergies)
1 голос
/ 27 февраля 2020

Если вы хотите, чтобы люди с аллергией 2 и 3 делали это:

let allergy = [2,3];
const personsWithAllergy = persons.filter(
   p => p.allergy.some(al => allergy.includes(al.idAllergy)));

const persons = [
    {
        personId: 1,
        name: 'Patrick',
        lastName: 'Smith',
        age: 27,
        allergy: [
            {
                idAllergy: 1,
                name: 'Fish'
            },{
                idAllergy: 2,
                name: 'Nuts'
            }
        ]
    },
    {
        personId: 2,
        name: 'Lara',
        lastName: 'Blake',
        age: 21,
        allergy: [
            {
                idAllergy: 2,
                name: 'Nuts'
            }
        ]
    },
    {
        personId: 3,
        name: 'Erick',
        lastName: 'Robinson',
        age: 30,
        allergy: [
            {
                idAllergy: 3,
                name: 'Flowers'
            }
        ]
    },
    {
        personId: 4,
        name: 'Hilda',
        lastName: 'Vianne',
        age: 35,
        allergy: [
            {
                idAllergy: 4,
                name: 'Chocolat'
            }
        ]
    }

]


const allergy = [2,3];
const personsWithAllergy = persons.filter(p => p.allergy.some(al => allergy.includes(al.idAllergy)));

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