获取数组中具有和没有某些属性的对象的名称

时间:2020-05-20 11:53:22

标签: javascript arrays object

所以我有一个对象数组,其中包含另一个数组,我想获得一个新的对象数组,这些对象的数组中包含特定内容,而排除那些没有的对象。 (使用JavaScript)

更具体。我有一个像这样的数组:

let chars = [
  {
    name: 'John',
    abilities: ['swim', 'jump', 'sing']
  },
  {
    name: 'Mark',
    abilities: ['run', 'jump']
  },
  {
    name: 'Bob',
    abilities: ['swim', 'run', 'sing']
  },
  {
    name: 'Jack',
    abilities: ['jump', 'swim', 'run']
  }
];

例如,我只想获得那些会游泳和跳跃但不能跑步的字符。

我想过要制作两个像

的数组
let includeAbilities = ['swim', 'jump'];
let excludeAbilities = ['run'];

,然后以某种方式比较它们,但我真的不知道该怎么做。你能帮我吗?

2 个答案:

答案 0 :(得分:1)

我会结合使用Array.prototype.filterArray.prototype.every

const filteredChars = chars.filter(character => (
    includeAbilities.every(
        ability => character.abilities.includes(ability)
    ) &&
    excludeAbilities.every(
        ability => !character.abilities.includes(ability)
    )
));

结果:

[
    {
        name: 'John',
        abilities: ['swim', 'jump', 'sing']
    }
]

在你的情况下,唯一匹配的人物是约翰,因为他会游泳和跳跃,但不能跑步。

答案 1 :(得分:-1)

let chars = [
  {
    name: 'John',
    abilities: ['swim', 'jump', 'sing']
  },
  {
    name: 'Mark',
    abilities: ['run', 'jump']
  },
  {
    name: 'Bob',
    abilities: ['swim', 'run', 'sing']
  },
  {
    name: 'Jack',
    abilities: ['jump', 'swim', 'run']
  }
];
// This is ES6 syntax, arrow functions: char => char.abilities.includes('swim') is the same as  
// function(char) { return char.abilities.includes('swim') };
const canSwim = chars.filter(char => char.abilities.includes('swim'));
console.log(canSwim);
// You can make it even shorter with destructuring objects
const canSwimAndSing = chars.filter(({
  abilities
}) => {
  return abilities.includes('swim') && abilities.includes('sing')
});
console.log(canSwimAndSing);