如何在JavaScript矩阵中筛选含特定字符串的子数组并分组
按性别分类矩阵数组的解决方案
问题描述
现有如下格式的矩阵数组:
const chartypes = [ ["bad boy","masc"], ["celebrity","neut"], ["activist","neut"], ["expert","neut"], ["princess","fem"], ["manager","neut"] //, etc. ];
需要按性别规则分类:
- 生成
femtypes数组:包含所有子数组中第二个元素为"neut"或"fem"的完整子数组 - 生成
masctypes数组:包含所有子数组中第二个元素为"neut"或"masc"的完整子数组
预期结果:
femtypes = [ ["celebrity","neut"], ["activist","neut"], ["expert","neut"], ["princess","fem"], ["manager","neut"] ]; masctypes = [ ["bad boy","masc"], ["activist","neut"], ["expert","neut"], ["manager","neut"] ];
尝试过用字符串包含检测,但不知道如何获取对应完整子数组,同时纠结是否应该用带属性的对象替代数组。
解决方案
方法一:直接基于现有数组处理
利用数组的filter方法,直接筛选符合条件的子数组。每个子数组的第二个元素(索引1)就是性别标识,直接判断即可:
const chartypes = [ ["bad boy","masc"], ["celebrity","neut"], ["activist","neut"], ["expert","neut"], ["princess","fem"], ["manager","neut"] ]; // 生成femtypes:筛选neut或fem的子数组 const femtypes = chartypes.filter(item => { const gender = item[1]; return gender === "neut" || gender === "fem"; }); // 生成masctypes:筛选neut或masc的子数组 const masctypes = chartypes.filter(item => { const gender = item[1]; return gender === "neut" || gender === "masc"; }); console.log(femtypes); console.log(masctypes);
filter方法会遍历原数组,返回所有满足条件的完整子数组,完全符合需求。
方法二:改用对象结构优化(可选)
如果后续需求更复杂,比如需要频繁按性别、角色名查询,改用对象结构会更清晰易维护:
// 定义为对象数组 const chartypes = [ { role: "bad boy", gender: "masc" }, { role: "celebrity", gender: "neut" }, { role: "activist", gender: "neut" }, { role: "expert", gender: "neut" }, { role: "princess", gender: "fem" }, { role: "manager", gender: "neut" } ]; // 筛选逻辑更直观 const femtypes = chartypes.filter(item => item.gender === "neut" || item.gender === "fem"); const masctypes = chartypes.filter(item => item.gender === "neut" || item.gender === "masc");
这种方式不需要依赖索引,可读性更强,后续扩展字段(比如添加描述、权重等)也更方便。
内容的提问来源于stack exchange,提问作者corvidia
相关产品推荐
相关产品推荐

