You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:基于对象键值匹配筛选对象数组并生成目标新数组

JavaScript: 根据指定数组的属性筛选对象数组的键值对

你的需求很明确:要从arr2的每个对象中,只保留那些键匹配arr1中对象head属性的键值对,最终组成arr3。先看看你原来代码的问题,再给你正确的实现方案。

原代码的问题

你写的嵌套map逻辑有两个关键错误:

  1. 错误的属性访问:elm.object.key完全不存在,arr2里的每个元素是普通对象,没有object这个层级,你需要直接遍历对象的键来判断。
  2. 逻辑方向错误:你用arr1的每个元素去遍历arr2,这会导致arr2的每个对象被重复处理多次,而且你直接把整个elm推入arr3,没有筛选掉不需要的键值对。

正确实现方案

我们可以分两步来完成:

  1. 先从arr1中提取所有需要保留的键,存入一个集合(集合的查找效率更高)。
  2. 遍历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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 17:42:49