所以我有一个对象数组,其中包含另一个数组,我想获得一个新的对象数组,这些对象的数组中包含特定内容,而排除那些没有的对象。 (使用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'];
,然后以某种方式比较它们,但我真的不知道该怎么做。你能帮我吗?
答案 0 :(得分:1)
我会结合使用Array.prototype.filter
和Array.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);