You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何遍历数组仅为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 20:00:12