javascript - 使用可变过滤器从json对象中删除项目

标签 javascript node.js

我得到了一个带有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对象。

如何进行变异?

最佳答案

使用findIndex,然后直接修改对象?不知道这是否正是您想要的。



let guilds = [ { "id": 1, "roleIds": [ 1, 2, 3 ] }, { "id": 2, "roleIds": [ 4, 5, 6 ] }, { "id": 3, "roleIds": [ 7, 8, 9 ] }];

let guild = { "id": 1, "roleIds": [ 1, 2, 3 ] }

let targetId = 1; // mock
const roleIdExists = id => [1,7,8].includes(id); // mock
console.log('guilds',guilds.length);
let i = guilds.findIndex(guild => {
  console.log('guild',guild);
  return guild.id === targetId;
});
if(i===-1)
  throw Error('No guild!')
let targetRoleIds = guilds[i].roleIds;

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

console.log(guilds[0])

关于javascript - 使用可变过滤器从json对象中删除项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52723737/

相关文章:

javascript - 观察到在背景中最大化图像滚动?

javascript - 本地 laravel API 上的 Nativescript-Vue axios 调用错误 [请求失败,状态码为空]

javascript - NPM - 添加到 package.json 但不安装

javascript - 更改表单的语言

javascript - 使用 node.js 提供动态 .js 文件

javascript - 导轨 4 : turbo-links change mouse cursor when loading

node.js - 将 Meteor 应用程序部署到 Elastic Beanstalk

javascript - express deprecated res.sendfile : Use res. sendFile 代替

node.js - 单击基于 $eval 的 div 抛出 div click 不是 puppeteer 中的函数

javascript - 在多个 Browserify 或 Webpack 包中共享通过 NPM 加载的模块的简单解决方案