如何让第三方PHP生成的JS对象数值属性保持原顺序?
如何让JavaScript对象保留数字属性的原始顺序
首先得明确:JavaScript里的对象,只要属性名是可以被解析为整数的数字(包括字符串形式的数字,比如"221"),就会自动按升序排列,这是ES6规范明确规定的。所以你直接用Object.keys(stk[24])或者遍历对象,得到的都是排序后的结果,没法直接改变这个默认行为。
但既然你没法控制第三方PHP插件生成对象的过程,那可以试试下面这两个可行的办法:
办法一:从生成的JS代码字符串中提取原始键顺序
因为你的stk是第三方直接输出的JS对象字面量,我们可以把这段代码的字符串拿过来,用正则提取出每个属性的原始顺序,再根据这个顺序来获取stk[24]的属性。
举个具体的例子:
// 先把第三方生成的stk定义字符串存下来(如果是页面里的脚本,你可以直接复制这段代码) const stkCode = `var stk={3:{221:1,220:1,224:1,226:1,198:1},24:{221:1,220:1,224:1,226:1,198:1},33:{198:1},9:{223:1,221:1,220:1,224:1,226:1,198:1},156:{220:1,224:1,226:1}};`; // 提取出键为24的内部对象的所有属性键 const matchResult = stkCode.match(/24:\{([^}]+)\}/); if (matchResult) { const innerProps = matchResult[1]; // 分割出每个键,得到原始顺序的键数组 const originalKeys = innerProps.split(',').map(item => item.split(':')[0].trim()); // 现在你可以根据这个顺序来处理stk[24]的属性了 // 比如遍历原始顺序: originalKeys.forEach(key => { console.log(`${key}: ${stk[24][key]}`); }); // 或者构建一个保持顺序的数组(因为对象还是会排序,所以用数组存更稳妥) const orderedStk24 = originalKeys.map(key => ({ [key]: stk[24][key] })); console.log(orderedStk24); }
⚠️ 注意:这个方法依赖于第三方生成的JS代码格式固定,如果代码里的空格、换行或者写法有变化,你需要调整正则表达式来适配。
办法二:建议插件开发者调整输出格式
如果有可能联系到第三方插件的开发者,可以给他们提两个优化建议:
- 把数字属性名改成带非数字前缀的字符串,比如
"k221"、"key_220",这样JS对象就会保留插入顺序(因为这些键不再是纯数字型)。 - 输出为
Map的构造形式,比如:
这样var stk = new Map([ [3, new Map([[221,1], [220,1], [224,1], [226,1], [198,1]])], [24, new Map([[221,1], [220,1], [224,1], [226,1], [198,1]])], // ...其他项 ]);stk.get(24)就是一个Map,遍历的时候会完全保留原始的属性顺序,而且使用起来也很方便。
总的来说,因为JS规范的限制,直接用普通对象没法保留数字键的原始顺序,只能通过上述方法间接实现。
内容的提问来源于stack exchange,提问作者itskashi
相关产品推荐
相关产品推荐

