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

如何在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);

代码说明

  1. Object.keys(a1[0]):获取第一个对象的所有属性键,因为数组中所有对象结构一致,无需遍历整个数组。
  2. map遍历每个键:将键名直接赋值给text,通过key.slice(-1)提取键名最后一个字符作为fieldName。
  3. 最终生成的数组完全符合预期结构。

如果需要使用forEach实现,逻辑类似:

const result = [];
Object.keys(a1[0]).forEach(key => {
  result.push({
    text: key,
    fieldName: key.slice(-1)
  });
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 05:45:40