如何遍历数组仅为deviceListJson添加cardNumber字段?
问题描述
我通过readJSON读取了两个JSON文件:deviceFilePath中的设备列表deviceListData,以及playersFilePath中的玩家列表playerListData。需求是为deviceListData中的每个设备对象随机添加playerListData里的cardNumber字段。
但当前代码运行后,会把玩家的所有字段(如firstName、middleName)都添加到设备对象中,而非仅cardNumber字段。以下是我的代码:
export async function assignPlayerCards() { try { const deviceListData = await readJSON(deviceFilePath); const playerListData = await readJSON(playersFilePath); const cardNumber = playerListData.map((item) => item.cardNumber); // Function to get a random card number from player list json function getRandomJson1Element() { const randomIndex = Math.floor(Math.random() * cardNumber.length); // console.log(cardNumber[randomIndex]); return playerListData[randomIndex]; } // Update each element in device JSON with a random card number from player list JSON deviceListData.forEach((element) => { const randomElement = getRandomJson1Element(); Object.assign(element, randomElement); }); await writeJSON(deviceFilePath, deviceListData); console.log("Headers set for devices"); } catch (error) { throw error; } }
问题原因与修复方案
错误原因
你的代码里getRandomJson1Element返回的是整个玩家对象,之后用Object.assign(element, randomElement)会把这个玩家对象的所有属性(包括firstName、middleName等)都合并到设备对象中,这就导致了多余字段被添加。另外你定义的cardNumber数组其实没用到,可以直接删除。
修复方式(两种可选)
方式一:直接返回随机的cardNumber值
修改工具函数,让它只返回选中玩家的cardNumber,然后直接给设备对象赋值:
export async function assignPlayerCards() { try { const deviceListData = await readJSON(deviceFilePath); const playerListData = await readJSON(playersFilePath); // 直接返回随机的cardNumber值 function getRandomCardNumber() { const randomIndex = Math.floor(Math.random() * playerListData.length); return playerListData[randomIndex].cardNumber; } deviceListData.forEach((element) => { // 给设备对象添加cardNumber字段 element.cardNumber = getRandomCardNumber(); }); await writeJSON(deviceFilePath, deviceListData); console.log("Headers set for devices"); } catch (error) { throw error; } }
方式二:用Object.assign时只传入包含cardNumber的对象
如果一定要保留Object.assign的写法,只需要在合并时传入一个仅包含cardNumber的新对象即可:
export async function assignPlayerCards() { try { const deviceListData = await readJSON(deviceFilePath); const playerListData = await readJSON(playersFilePath); function getRandomPlayer() { const randomIndex = Math.floor(Math.random() * playerListData.length); return playerListData[randomIndex]; } deviceListData.forEach((element) => { const randomPlayer = getRandomPlayer(); // 只合并cardNumber字段 Object.assign(element, { cardNumber: randomPlayer.cardNumber }); }); await writeJSON(deviceFilePath, deviceListData); console.log("Headers set for devices"); } catch (error) { throw error; } }
内容的提问来源于stack exchange,提问作者BruceyBandit
相关产品推荐
相关产品推荐

