JavaScript:使用过滤对象列表筛选目标对象列表
没问题,我来帮你搞定用一个对象列表过滤另一个对象列表的需求!
用一个对象列表过滤英雄列表的实现方案
先补全你给出的英雄列表(把soldier的attribute补全为strength),方便后续演示:
const heroes = [ { name: "warrior", primary_skill: "greater bash", attack_type: "melee", attribute: "strength" }, { name: "ranger", primary_skill: "focus fire", attack_type: "range", attribute: "agility" }, { name: "mage", primary_skill: "oblivion", attack_type: "magic", attribute: "intelligence" }, { name: "soldier", primary_skill: "sword dance", attack_type: "melee", attribute: "strength" } ];
接下来分两种常见场景给你写实现代码:
场景1:匹配过滤列表中任意一个条件
假设你的过滤列表是这样的(想筛选力量型英雄或远程攻击英雄):
const filterList = [ { attribute: "strength" }, { attack_type: "range" } ];
用filter + some就能快速实现:
const filteredHeroes = heroes.filter(hero => { // 检查当前英雄是否符合过滤列表里的任意一个条件 return filterList.some(filter => { const [key, value] = Object.entries(filter)[0]; return hero[key] === value; }); }); console.log(filteredHeroes); // 输出结果:warrior、ranger、soldier
场景2:匹配过滤列表中所有条件
如果需要英雄同时满足多个过滤条件(比如要找力量型且近战的英雄),把some换成every即可:
const strictFilterList = [ { attribute: "strength" }, { attack_type: "melee" } ]; const strictlyFilteredHeroes = heroes.filter(hero => { // 检查当前英雄是否符合过滤列表里的所有条件 return strictFilterList.every(filter => { const [key, value] = Object.entries(filter)[0]; return hero[key] === value; }); }); console.log(strictlyFilteredHeroes); // 输出结果:warrior、soldier
扩展:支持多键值对的复杂过滤条件
如果你的过滤对象包含多个键值对(比如要找敏捷型且远程的英雄),可以调整内部判断逻辑:
const complexFilterList = [ { attribute: "agility", attack_type: "range" }, { attribute: "intelligence" } ]; const complexFilteredHeroes = heroes.filter(hero => { return complexFilterList.some(filter => { // 检查当前英雄是否满足这个过滤对象的所有键值对 return Object.entries(filter).every(([key, value]) => hero[key] === value); }); }); console.log(complexFilteredHeroes); // 输出结果:ranger、mage
这样不管你的过滤条件是简单还是复杂,都能灵活适配啦~
内容的提问来源于stack exchange,提问作者Dale
相关产品推荐
相关产品推荐

