
本文介绍如何遍历设备 JSON 数组,并仅为每个设备对象添加一个 cardNumber 字段(从玩家列表中随机选取),避免误将玩家全部属性(如 firstName、middleName)合并进设备对象。
本文介绍如何遍历设备 json 数组,并仅为每个设备对象添加一个 cardnumber 字段(从玩家列表中随机选取),避免误将玩家全部属性(如 firstname、middlename)合并进设备对象。
在实际开发中,我们常需将两个独立的 JSON 数据源进行轻量级关联——例如为一批设备随机绑定玩家卡号。但若直接使用 Object.assign(element, randomPlayer),会将整个玩家对象的所有键值对(包括 firstName、middleName 等无关字段)一并写入设备对象,违背了“仅添加 cardNumber”的核心需求。
问题根源在于:getRandomJson1Element() 返回的是完整玩家对象(如 { cardNumber: "111", firstName: "MICKEY", middleName: "A" }),而 Object.assign(element, randomElement) 会浅拷贝其所有自有可枚举属性。解决方法非常简洁:只取所需字段的值,显式赋值。
✅ 正确做法如下:
// 更新每个设备对象,仅注入随机选取的 cardNumber 字段
deviceListData.forEach((device) => {
const randomPlayer = playerListData[
Math.floor(Math.random() * playerListData.length)
];
device.cardNumber = randomPlayer.cardNumber;
});
该写法去除了冗余函数封装,逻辑更直观、性能更优(避免重复创建闭包和中间变量),且严格保证仅添加 cardNumber 字段。
? 进阶建议:
- 若需均匀分配(即每个卡号尽可能被使用且不重复),可先打乱
playerListData,再用.map()或索引轮询方式分配; - 若设备数量 > 玩家数量,建议使用
Math.random()配合取模或循环索引,避免某卡号被过度复用; - 生产环境建议增加校验:
if (!playerListData || playerListData.length === 0) throw new Error("No players available for assignment");
最终,deviceListData 将精准变为符合预期的结构——每个设备对象仅新增 cardNumber 字段,其余属性保持原样,干净、可控、可维护。










