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]]) );
原理很简单:
- 先用
map把keyColumns里的每个列名,转换成[键名, 对应值]的二维数组 - 再用
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
相关产品推荐
相关产品推荐

