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

Typescript如何从数组数据构建指定键值对的JSON对象?

解决方法:从对象中提取指定键值对

其实你的思路完全没问题!问题只是出在变量名的大小写错误上——你定义的目标对象是keyValueMap,但循环里写成了全小写的keyvaluemap,而JavaScript是严格区分大小写的,导致赋值操作根本没作用到正确的对象上。

修正你的原代码

只需要把变量名统一成keyValueMap就可以正常工作了:

const data = {COLUMN1: "DATA1", COLUMN2: "DATA2", COLUMN3: "DATA3", COLUMN5: "DATA5", COLUMN9: "DATA9"};
const keyColumns = ["COLUMN2", "COLUMN5", "COLUMN9"];
const keyValueMap = {};

if (keyColumns.length > 0) {
  keyColumns.forEach(col => {
    // 这里修正变量名大小写
    keyValueMap[col] = data[col];
  });
};

console.log(keyValueMap);
// 输出:{ COLUMN2: 'DATA2', COLUMN5: 'DATA5', COLUMN9: 'DATA9' }

这里用对象的方括号语法keyValueMap[col]是完全合法的,哪怕键名是运行时动态确定的(比如keyColumns的内容只有运行时才知道),方括号语法就是专门用来处理这种动态属性访问的场景。

更简洁的实现方式:使用Object.fromEntries

如果你想让代码更简洁,可以用ES2019新增的Object.fromEntries方法,一行就能搞定:

const keyValueMap = Object.fromEntries(
  keyColumns.map(col => [col, data[col]])
);

原理很简单:

  1. 先用map把keyColumns里的每个列名,转换成[键名, 对应值]的二维数组
  2. 再用Object.fromEntries把这个二维数组直接转换成目标对象

这种写法更符合函数式编程的风格,代码量更少,也更易读。

额外提示:处理不存在的键

如果担心data里可能没有keyColumns中的某些键,可以在赋值时做个判断,避免出现undefined:

// 原forEach版本的扩展
keyColumns.forEach(col => {
  if (data.hasOwnProperty(col)) {
    keyValueMap[col] = data[col];
  }
});

// Object.fromEntries版本的扩展
const keyValueMap = Object.fromEntries(
  keyColumns
    .filter(col => data.hasOwnProperty(col))
    .map(col => [col, data[col]])
);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:14:47