JavaScript仅支持var环境下创建递增键对象,避免元素丢失
对象子键按递增值生成时元素被覆盖的问题
需求与问题
我需要生成一个包含子对象的结构,子对象的键是原对象最后一个属性键的递增值,目标格式如下:
{ "0": { "user": "xyz", "group": "abc" }, "1": { "user": "xyz1", "group": "abc1" }, // ... 更多子对象 }
但现有代码会覆盖第一个元素,最终生成的元素数量总是比预期少一个。我的工作环境仅支持var,无法使用const和let,现有代码逻辑如下:
// passed_object(从函数传入的对象) var arr = ["user1", "user2", ...]; if (arr.length > 0) { // 如果用户列表中有多个用户 var obj_keys = Object.keys(passed_object); for (var j = 0; j < arr.length; j++) { var obj = {}; if (obj_keys.length === 0) { // 如果对象数组中没有用户,则创建用户对象的属性 obj.user = arr[j]; obj.group = grpDetails.name.toString(); // 来自之前的变量 passed_object[j + obj_keys.length] = obj; } else { for (var k in passed_object) { obj.user = arr[j]; obj.group = grpDetails.name.toString(); // 来自之前的变量 var mx_val = Math.max(obj_keys.length, parseInt(j + parseInt(obj_keys[Object.keys(obj_keys).length - 1]))); // 获取最后一个变量并据此创建对象 passed_object[mx_val] = obj; } } } }
问题根源
else分支中多余的for...in循环:遍历原对象的每个键时,会对同一个mx_val重复赋值,直接覆盖之前生成的子对象mx_val的计算逻辑错误:把索引j和最后一个键值相加,导致键值跳变,同时和obj_keys.length取最大值的逻辑完全不合理
修正后的代码
// passed_object(从函数传入的对象) var arr = ["user1", "user2", ...]; if (arr.length > 0) { var obj_keys = Object.keys(passed_object); // 计算初始的起始键值 var nextKey = obj_keys.length === 0 ? 0 : parseInt(obj_keys[obj_keys.length - 1]) + 1; for (var j = 0; j < arr.length; j++) { var obj = {}; obj.user = arr[j]; obj.group = grpDetails.name.toString(); // 直接用递增值作为键添加子对象 passed_object[nextKey] = obj; // 键值自增 nextKey++; } }
修正说明
- 提前计算初始的
nextKey:原对象为空时从0开始,否则取最后一个键的数值加1 - 去掉冗余的
for...in循环,避免重复赋值覆盖 - 遍历
arr时,每生成一个子对象就直接添加到passed_object的nextKey位置,然后nextKey自增,保证键值连续递增 - 统一了空对象和非空对象的处理逻辑,不需要分分支判断,代码更简洁
内容的提问来源于stack exchange,提问作者Shariq Azim
相关产品推荐
相关产品推荐

