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

如何向JSON对象内的数组push元素?Discord.js库存功能求助

解决Discord.js中JSON库存数组添加元素的问题

问题根源

你当前用+运算符拼接数组和字符串,会把原本的数组强制转换成字符串(比如[] + "itemName"会变成"itemName"),第二次执行时又把这个字符串和新物品名拼接,最终得到"itemNameitemName"——此时inventory已经不是数组,调用.push()自然会报错。

正确实现步骤

  1. 确保读取并解析JSON为JS对象:读取JSON文件后必须用JSON.parse()转换,否则操作的是字符串而非数组。
  2. 初始化用户数据(首次执行时):避免用户第一次用命令时出现inventory[userID]为undefined的情况。
  3. 用.push()添加元素:这是数组追加元素的标准方法,不会改变数组类型。
  4. 格式化写入JSON:用JSON.stringify的第二个参数添加空格,让输出的JSON更易读。

修正后的代码

const fs = require('fs');
const path = require('path');

// 替换为实际获取到的用户ID和物品名称
const userID = '目标用户ID';
const itemName = '要添加的物品';

// 读取并解析库存文件
const inventoryPath = path.join(__dirname, './data/inventory.json');
let inventory = {};
try {
  const rawData = fs.readFileSync(inventoryPath, 'utf8');
  inventory = JSON.parse(rawData);
} catch (err) {
  console.error('读取/解析库存文件出错:', err);
}

// 初始化用户库存(若用户不存在)
if (!inventory[userID]) {
  inventory[userID] = {
    inventory: []
  };
}

// 向数组添加物品
inventory[userID].inventory.push(itemName);

// 写入更新后的库存
fs.writeFile(inventoryPath, JSON.stringify(inventory, null, 2), err => {
  if (err) console.error('写入库存文件出错:', err);
});

执行两次命令后的输出

{
  "userID": {
    "inventory": [
      "itemName",
      "itemName"
    ]
  }
}

额外提示

  • 若使用异步逻辑,建议用fs.promises.readFile配合async/await,避免回调嵌套。
  • 始终保留文件读写的错误捕获,防止程序因文件操作异常崩溃。

内容的提问来源于stack exchange,提问作者bumpyroad44

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 19:30:54