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