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

将对象数组转换为单个对象并保持键的原有顺序

解决JavaScript数组对象合并后键顺序被打乱的问题

问题分析

你遇到的问题是JavaScript对象的固有特性导致的:对象会对整数类型的键(包括数字类型整数、可解析为整数的字符串键)自动进行升序排序,哪怕你是按数组里的顺序插入的。虽然ES6之后对象开始保留插入顺序,但这个规则对整数键不适用——它们会被优先提取并按数值大小排序,这就是为什么你的数字键顺序被打乱了。

解决方案

根据你的需求(保留键的原始顺序,同时保留字符串/数字键类型),这里提供几个针对性的方案:

方案1:用Map完美保留顺序和键类型

如果你不需要严格的普通对象,Map是最佳选择,它会完全遵循插入顺序,并且支持数字、字符串等多种类型的键:

const arrObj = [{"Plain bold italic text": "2"},{29: "1"},{24: "2"},{21: "2"},{26: "2"},{27: "2"}];
const mergedMap = new Map();

arrObj.forEach(element => {
  // 获取当前对象的键和值
  const [keyStr] = Object.keys(element);
  const value = parseInt(Object.values(element)[0], 10);
  // 把字符串形式的数字键转回原始数字类型(如果需要)
  const originalKey = isNaN(Number(keyStr)) ? keyStr : Number(keyStr);
  mergedMap.set(originalKey, value);
});

// 查看结果:完全保留原始顺序和键类型
console.log(mergedMap);
// 如果需要转为普通对象(注意:转成对象后数字键仍会被排序)
const mergedObj = Object.fromEntries(mergedMap);

方案2:手动构建JSON字符串(得到你期望的输出格式)

如果你必须得到符合期望格式的对象字符串(比如接口返回需要),可以手动拼接JSON字符串,这样能严格保留顺序:

const arrObj = [{"Plain bold italic text": "2"},{29: "1"},{24: "2"},{21: "2"},{26: "2"},{27: "2"}];

// 逐个处理每个对象,生成键值对字符串
const keyValuePairs = arrObj.map(item => {
  const [key] = Object.keys(item);
  const value = parseInt(Object.values(item)[0], 10);
  // 给字符串键添加引号,数字键直接保留
  const formattedKey = typeof key === 'string' ? `"${key}"` : key;
  return `${formattedKey}: ${value}`;
});

// 拼接成最终的JSON字符串
const resultJson = `{${keyValuePairs.join(', ')}}`;
console.log(resultJson);
// 输出:{"Plain bold italic text": 2, "29": 1,"24": 2,"21": 2,"26": 2,"27": 2}

方案3:修改数字键形式(得到普通对象并保留顺序)

如果你需要一个普通对象且必须保留顺序,只能修改数字键的格式,让它不被识别为整数键(比如加前缀),代价是键的原始值会改变:

const arrObj = [{"Plain bold italic text": "2"},{29: "1"},{24: "2"},{21: "2"},{26: "2"},{27: "2"}];
const mergedObj = {};

arrObj.forEach(element => {
  let [key] = Object.keys(element);
  // 给数字键添加前缀,避免被自动排序
  if (!isNaN(Number(key))) {
    key = `key_${key}`;
  }
  mergedObj[key] = parseInt(Object.values(element)[0], 10);
});

console.log(mergedObj);
// 输出:{"Plain bold italic text": 2, "key_29": 1, "key_24": 2, "key_21": 2, "key_26": 2, "key_27": 2}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:31:15