首页 > 解决方案 > 使用可变过滤器从 json 对象中删除项目

问题描述

我有一个带有 3 个“公会”的 json 文件。这些公会有一个 id 和一个包含角色 id 的数组。

[
  {
    "id": 1, // This is the id of a guild
    "roleIds": [
      1,
      2,
      3
    ]
  },
  {
    "id": 2,
    "roleIds": [
      4,
      5,
      6
    ]
  },
  {
    "id": 3,
    "roleIds": [
      7,
      8,
      9
    ]
  }
]

另一方面,我有一个客户持有另一个带有公会和角色的 json 对象。如果客户端不存在角色 ID,则数据不一致。然后我想从json文件中删除ID。

通常我通过使用从数组中删除项目array.filter(element => element.id !== targetId);

const guilds = fs.readFileSync(file);
const targetGuild = guilds.find(guild => guild.id == targetGuildid);
let targetRoleIds = targetGuild.roleIds;

targetRoleIds.forEach(targetRoleId => {
  if (!roleIdExists(guild, targetRoleId)) {
    targetRoleIds = targetRoleIds.filter(id => id != targetRoleId);
  }
});

fs.writeFileSync(file, JSON.stringify(guilds));

使用targetRoleIds = targetRoleIds.filter(id => id != targetRoleId);不影响guilds对象。

我怎样才能变异它?

标签: javascriptnode.js

解决方案


真的,你的代码很混乱:

  1. 您读取文件并将其分配给guilds变量,但最终写入相同的变量而不进行修改。
  2. 在行代码中if (!roleIdExists(guild, targetRoleId)),我不知道您如何获取guild变量。

请检查您的代码。我留下了我理解的代码

let guilds = fs.readFileSync(file);
guilds = guilds.map((guild) => {
  if (guild.id === targetGuildId) {
    guild.roleIds = guild.roleIds.filter((roleId) => targetGuildRoles.includes(roleId));
  }
  return guild;
})

fs.writeFileSync(file, JSON.stringify(guilds));


推荐阅读