JavaScript中如何将数组对象转换为指定的多对象目标数组?
问题:合并筛选条件数组的正确方式
原始输入数组:
[ {subjects: "Literature"}, {subjects: "Science"}, {ageLevels: "Preschool"} ]
目标输出数组:
[ {subjects: "Literature", ageLevels: "Preschool"}, {subjects: "Science"} ]
当前使用的代码无法保留所有subjects项,最终仅得到{subjects: 'Literature', ageLevels: 'Preschool'},需要修改代码以生成符合要求的数组。
当前代码:
let selectedFilters = []; let selectedSubjects = ["Science", "Literature"]; let selectedAge = ["Preschool"]; let finalObj = {}; if (selectedSubjects.length > 0) { selectedSubjects.forEach((element) => { let subj = {}; subj.subjects = element; selectedFilters.push(subj); }); } if (selectedAge.length > 0) { selectedAge.forEach((element) => { let age = {}; age.ageLevels = element; selectedFilters.push(age); }); } for (let i = 0; i < selectedFilters.length; i++) { Object.assign(finalObj, selectedFilters[i]); }
解决方案
直接基于选中的科目和年龄处理
如果已经有selectedSubjects和selectedAge这两个数组,直接遍历科目数组,给第一个科目附加年龄属性即可:
let selectedSubjects = ["Science", "Literature"]; let selectedAge = ["Preschool"]; let finalFilters = []; selectedSubjects.forEach((subject, index) => { const filterItem = { subjects: subject }; // 仅给第一个科目添加年龄级别(如果有选中的年龄) if (index === 0 && selectedAge.length > 0) { filterItem.ageLevels = selectedAge[0]; } finalFilters.push(filterItem); }); console.log(finalFilters);
基于原始拆分数组处理
如果是从原始的拆分数组(即开头的输入数组)出发,先提取出所有科目和年龄,再按规则组合:
const inputArr = [ {subjects: "Literature"}, {subjects: "Science"}, {ageLevels: "Preschool"} ]; // 提取所有科目和年龄项 const subjectsList = inputArr.filter(item => item.subjects).map(item => item.subjects); const ageList = inputArr.filter(item => item.ageLevels).map(item => item.ageLevels); const finalFilters = subjectsList.map((subject, index) => { const resultItem = { subjects: subject }; // 第一个科目附加年龄(如果存在年龄数据) if (index === 0 && ageList.length > 0) { resultItem.ageLevels = ageList[0]; } return resultItem; }); console.log(finalFilters);
代码说明
- 核心逻辑是为每个科目创建独立对象,仅给第一个科目添加年龄属性,避免了原代码中把所有对象合并成单个对象导致的覆盖问题
- 这样处理后,所有科目都会被保留,同时第一个科目带上年龄筛选条件,完全匹配目标输出格式
内容的提问来源于stack exchange,提问作者pepperoo
相关产品推荐
相关产品推荐

