如何从对象数组的permissionSets中移除X00开头的元素?
问题描述
我有如下格式的对象数组:
const updatedUsersInfo = [ { alias: 'ba', userId: '0058V00000DYOqsQAH', username: 'ba@dna05.com', permissionSets: [ 'X00e8V000000iE48QAE', 'SCBanquetAccess', 'SCViewOnlyPermission' ] }, { alias: 'cs', userId: '0058V00000DYOqtQAH', username: 'cs@dna05.com', permissionSets: [ 'X00e8V000000iE45QAE', 'SCCorpAdmin', 'SEAdmin' ] } ]
需要从每个对象的permissionSets数组中移除所有以X00开头的元素,得到如下结果:
const updatedUsersInfo = [ { alias: 'ba', userId: '0058V00000DYOqsQAH', username: 'ba@dna05.com', permissionSets: [ 'SCBanquetAccess', 'SCViewOnlyPermission' ] }, { alias: 'cs', userId: '0058V00000DYOqtQAH', username: 'cs@dna05.com', permissionSets: [ 'SCCorpAdmin', 'SEAdmin' ] } ]
我尝试了多种方法都得到undefined,部分尝试代码如下:
let test = updatedUsersInfo.forEach((element => element['permissionSets'].filter((permissionSet) => !permissionSet.includes('X00')))); let test2 = updatedUsersInfo.forEach(element => { element['permissionSets'].filter((permissionSet) => { return !permissionSet.includes('X00') }); });
还试过用splice但报错无法执行,我主要是C#开发者,TypeScript完全是新领域,希望得到帮助。
解决方案
问题根源
forEach的返回值特性:forEach方法本身没有返回值,始终返回undefined,所以用它赋值给变量必然得到undefined。filter的作用逻辑:filter不会修改原数组,而是返回一个过滤后的新数组。你之前的代码仅调用了filter但未将结果赋值回原对象的permissionSets属性,因此原数组没有任何变化。splice报错原因:如果报错无法执行splice,大概率是操作时索引计算错误,或是误将非数组类型当作数组操作。
正确实现方法
方法1:原地修改原数组
遍历数组中的每个对象,将permissionSets替换为过滤后的新数组:
updatedUsersInfo.forEach(user => { // 用filter返回的新数组覆盖原permissionSets user.permissionSets = user.permissionSets.filter(perm => !perm.startsWith('X00')); });
这里用startsWith('X00')比includes('X00')更精准,因为需求是以X00开头,而非包含X00的所有元素。
方法2:生成新数组(不改动原数据)
如果需要保留原始数组,可以用map方法生成全新数组,每个对象是原对象的副本,仅更新permissionSets:
const filteredUsers = updatedUsersInfo.map(user => ({ // 复制原对象的所有属性 ...user, // 替换permissionSets为过滤后的数组 permissionSets: user.permissionSets.filter(perm => !perm.startsWith('X00')) }));
这种方式不会改变原数组updatedUsersInfo,适合需要保留原始数据的场景。
补充说明
- TypeScript/JavaScript的数组方法和C#的LINQ有相似性,但存在差异:比如
forEach类似C#的ForEach但无返回值;filter类似Where,返回新集合;map类似Select。 - 用
startsWith判断开头比includes更准确,能避免误删中间包含X00的合法权限集。
内容的提问来源于stack exchange,提问作者Nicole Phillips
相关产品推荐
相关产品推荐

