求助:基于对象键值匹配筛选对象数组并生成目标新数组
JavaScript: 根据指定数组的属性筛选对象数组的键值对
你的需求很明确:要从arr2的每个对象中,只保留那些键匹配arr1中对象head属性的键值对,最终组成arr3。先看看你原来代码的问题,再给你正确的实现方案。
原代码的问题
你写的嵌套map逻辑有两个关键错误:
- 错误的属性访问:
elm.object.key完全不存在,arr2里的每个元素是普通对象,没有object这个层级,你需要直接遍历对象的键来判断。 - 逻辑方向错误:你用
arr1的每个元素去遍历arr2,这会导致arr2的每个对象被重复处理多次,而且你直接把整个elm推入arr3,没有筛选掉不需要的键值对。
正确实现方案
我们可以分两步来完成:
- 先从
arr1中提取所有需要保留的键,存入一个集合(集合的查找效率更高)。 - 遍历
arr2的每个对象,筛选出键在集合中的键值对,组成新对象并收集到arr3。
基础实现版
const arr1 = [ {head: "first_name", value:"First Name"}, {head: "last_name", value:"Last Name"}, {head: "age", value:"Age"}]; const arr2 = [ {car:"aa", xyz:"asdsa", abc:"dsds",first_name: "Jack", last_name: "Dan", age:"25"}, {car:"bb", xyz:"asdsa", abc:"dsds",first_name: "Mark", last_name: "Wood", age:"28"}, {car:"cc", xyz:"asdsa", abc:"dsds",first_name: "Carl", last_name: "R", age:"25"}, { car:"dd", xyz:"asdsa", abc:"dsds",first_name: "Max", last_name: "P", age:"25"} ]; // 提取需要保留的键集合 const allowedKeys = new Set(arr1.map(item => item.head)); // 处理arr2,筛选每个对象的指定键值对 const arr3 = arr2.map(obj => { const filteredObj = {}; // 遍历当前对象的所有键 for (const key in obj) { // 如果键在允许的集合中,就保留这个键值对 if (allowedKeys.has(key)) { filteredObj[key] = obj[key]; } } return filteredObj; }); console.log(arr3);
简洁版(利用ES6+API)
如果你喜欢更简洁的写法,可以用Object.entries和Object.fromEntries来简化:
const arr1 = [ {head: "first_name", value:"First Name"}, {head: "last_name", value:"Last Name"}, {head: "age", value:"Age"}]; const arr2 = [ {car:"aa", xyz:"asdsa", abc:"dsds",first_name: "Jack", last_name: "Dan", age:"25"}, {car:"bb", xyz:"asdsa", abc:"dsds",first_name: "Mark", last_name: "Wood", age:"28"}, {car:"cc", xyz:"asdsa", abc:"dsds",first_name: "Carl", last_name: "R", age:"25"}, { car:"dd", xyz:"asdsa", abc:"dsds",first_name: "Max", last_name: "P", age:"25"} ]; const allowedKeys = new Set(arr1.map(item => item.head)); const arr3 = arr2.map(obj => Object.fromEntries( // 将对象转为键值对数组,筛选出符合条件的项,再转回对象 Object.entries(obj).filter(([key]) => allowedKeys.has(key)) ) ); console.log(arr3);
这两种方式都能得到你预期的arr3结果,后者更简洁,适合现代JavaScript环境。
内容的提问来源于stack exchange,提问作者Vishnu Shenoy
相关产品推荐
相关产品推荐

