如何在JavaScript中通过方法返回指定结构的动态数据?
问题:从动态属性的对象数组生成指定结构的对象数组
现有对象数组a1,每个对象包含动态命名的属性(如dummy1_A、dummy2_B等),需要生成一个包含text(对应原属性键名)和fieldName(对应键名末尾的A/B)的对象数组,预期输出如下:
[ { text: 'dummy1_A', fieldName: 'A' }, { text: 'dummy2_A', fieldName: 'A' }, { text: 'dummy3_A', fieldName: 'A' }, { text: 'dummy1_B', fieldName: 'B' }, { text: 'dummy2_B', fieldName: 'B' }, { text: 'dummy3_B', fieldName: 'B' }, ];
用户尝试使用map和forEach方法实现,但未得到正确结果,相关代码如下:
let a1 = [ { dummy1_A: 0.5526714707565221, dummy2_A: 0.5526714707565223, dummy3_A: 0.5526714707565224, dummy1_B: 0.5028423429150607, dummy2_B: 0.5028423429150605, dummy3_B: 0.5028423429150604, }, { dummy1_A: 0.542947572819916, dummy2_A: 0.4965857885945633, dummy3_A: 0.4965857885945677, dummy1_B: 0.4470431086251489, dummy2_B: 0.3785646261205342, dummy3_B: 0.3785646261205345, }, ]; let a2 = a1.map((x, i) => { let seqStr = String(a1.entries); // 此处逻辑错误 return { text: seqStr, fieldName: seqStr, }; }); // 用户尝试的forEach代码(仅处理了第一个键,逻辑不完整) a1.forEach(obj => { const key = Object.keys(obj)[0]; const newKey = key[key.length - 1]; obj[newKey] = obj[key]; delete obj[key]; });
解决方案
由于数组中每个对象的属性键完全一致,只需提取第一个对象的所有键,遍历这些键生成目标结构即可:
const a1 = [ { dummy1_A: 0.5526714707565221, dummy2_A: 0.5526714707565223, dummy3_A: 0.5526714707565224, dummy1_B: 0.5028423429150607, dummy2_B: 0.5028423429150605, dummy3_B: 0.5028423429150604, }, { dummy1_A: 0.542947572819916, dummy2_A: 0.4965857885945633, dummy3_A: 0.4965857885945677, dummy1_B: 0.4470431086251489, dummy2_B: 0.3785646261205342, dummy3_B: 0.3785646261205345, }, ]; // 提取第一个对象的所有属性键 const allKeys = Object.keys(a1[0]); // 生成目标数组 const result = allKeys.map(key => ({ text: key, fieldName: key.slice(-1) // 取键名最后一个字符作为fieldName })); console.log(result);
代码说明
Object.keys(a1[0]):获取第一个对象的所有属性键,因为数组中所有对象结构一致,无需遍历整个数组。map遍历每个键:将键名直接赋值给text,通过key.slice(-1)提取键名最后一个字符作为fieldName。- 最终生成的数组完全符合预期结构。
如果需要使用forEach实现,逻辑类似:
const result = []; Object.keys(a1[0]).forEach(key => { result.push({ text: key, fieldName: key.slice(-1) }); });
内容的提问来源于stack exchange,提问作者JSG
相关产品推荐
相关产品推荐

