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

如何根据字符串数组筛选对象数组中formData的指定键?

问题描述

我从后端拉取数据到应用中,希望支持用户选择需要查看的键。因此尝试实现一个功能:让用户生成字符串数组,将其与对象数组中的每个对象对比,输出仅包含指定键的新对象数组。

筛选数组示例:

const filterData = 
[
'TestOne',
'TestTwo',
]

对象数组示例:

const data = [
  {
    _id: "62ec2f1084c7f48175a9cb4a",
    Date: "2022-08-04T15:41:37.567Z",
    facilityId: "62e5a9fd45f2646fc7361fa3",
    userId: "62e16d390f4685e4fdb6a288",
    formData: {
      Date: "2022-08-04T15:41:37.567Z",
      TestOne: 60002,
      TestTwo: 19998,
      TestThree: 102,
      TestFour: "True"
    },
  },
  {
    _id: "62ec2f1c84c7f48175a9cb58",
    Date: "2022-08-04T15:41:52.932Z",
    facilityId: "62e5a9fd45f2646fc7361fa3",
    userId: "62e16d390f4685e4fdb6a288",
    formData: {
      Date: "2022-08-04T15:41:52.932Z",
      TestOne: 60003,
      TestTwo: 19997,
      TestThree: 103,
      TestFour: "True"
    },
  },
]

我需要编写一个函数,处理data中的formData,过滤掉不在filterData中的键,但始终无法实现。以下是我尝试的代码,但执行时报错Uncaught TypeError: Cannot delete property 'TestThree' of #<Object>,复制数据后也无法解决,请求帮助:

const formObject = 
  datas.length > 0 &&
  datas.map((data, i) => {
    const filterData = ['TestOne', 'TestTwo']
    filterData.map((filter) => {
      delete data.formData[filter]
    })
  })
解决方案

你的代码有三个核心问题:

  • 逻辑完全搞反:现在是删除需要保留的键,而不是删除不需要的键
  • 直接修改原数据:后端返回的对象可能被冻结,导致无法删除属性,这就是报错的原因
  • map函数无返回值:最终得到的formObject是全为undefined的数组

正确的做法是创建新对象,不修改原数据,只保留指定键:

基础实现方式

const filterData = ['TestOne', 'TestTwo'];

const filteredData = data.map(item => {
  const filteredFormData = {};
  // 遍历需要保留的键,构建新的formData
  filterData.forEach(key => {
    if (item.formData[key] !== undefined) {
      filteredFormData[key] = item.formData[key];
    }
  });
  // 返回新对象,保留原item的其他属性,替换formData
  return {
    ...item,
    formData: filteredFormData
  };
});

简洁实现方式(使用Object.fromEntries)

const filterData = ['TestOne', 'TestTwo'];

const filteredData = data.map(item => ({
  ...item,
  formData: Object.fromEntries(
    filterData
      .map(key => [key, item.formData[key]])
      .filter(([_, value]) => value !== undefined) // 过滤掉不存在的键
  )
}));

这样做既避免了修改原数据导致的冻结报错,又精准保留了需要的键,同时map函数返回正确的新对象数组。

内容的提问来源于stack exchange,提问作者Iamtheburnt

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 11:06:18