将对象数组转换为单个对象并保持键的原有顺序
解决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
相关产品推荐
相关产品推荐

