Javascript中嵌套了一些用于

Javascript中嵌套了一些用于,javascript,typescript,functional-programming,Javascript,Typescript,Functional Programming,下面的代码我正在尝试查看其中一个CrmRoles是否在roleToVerify列表中,但当我浏览它时,roleToVerify的“未定义” const rolesToVerify = ["System Administrator", "Payroll"] function userHasOneOrMoreRoles(currentUserRoles: CrmRole[], rolesToVerify: String[]) { for (let currentUserRole of cu

下面的代码我正在尝试查看其中一个CrmRoles是否在roleToVerify列表中,但当我浏览它时,roleToVerify的“未定义”

const rolesToVerify = ["System Administrator", "Payroll"]

function userHasOneOrMoreRoles(currentUserRoles: CrmRole[], rolesToVerify: String[]) {
    for (let currentUserRole of currentUserRoles) {
        return rolesToVerify.some(roleToVerify =>
           currentUserRole.Name === roleToVerify);
    }
    return false;
    }

你在一个循环中返回,与任何条件或任何事情无关。不可能,你的循环通过了第一次迭代

//And you can shorten
rolesToVerify.some(roleToVerify => currentUserRole.Name === roleToVerify);
//to
rolesToVerify.includes(currentUserRole.Name);
所以

function userHasOneOrMoreRoles(currentUserRoles: CrmRole[], rolesToVerify: String[]) {
    for (let currentUserRole of currentUserRoles) {
        if(rolesToVerify.includes(currentUserRole.Name))
            return true;
    }
    return false;
}

有两个问题。 首先,您可能错误地调用了您的函数,因为我认为它部分工作

其次,代码中存在一个逻辑问题:当您迭代currentUserRoles数组时,在第一次迭代之后执行
返回操作(除第一次迭代之外的其余元素将被忽略)

以下是我的拙见:

const rolestovify=[“系统管理员”、“工资单”];
键入CrmRole={Name:string};
函数userHasOneOrMoreRoles(currentUserRoles:CrmRole[],rolesToVerify:String[]){
for(让currentUserRole的currentUserRole){
让roleExists=roleToVerify.some(roleToVerify=>currentUserRole.Name==roleToVerify);
如果(roleExists){
返回角色存在;
}
}
返回false;
}
log(userHasOneOrMoreRoles([{Name:'horse'}],rolestovify));//返回false
log(userHasOneOrMoreRoles([{Name:'horse'},{Name:'cow'}],rolestovify));//返回false
log(userHasOneOrMoreRoles([{Name:rolesToVerify[0]}],rolesToVerify));//返回true

log(userHasOneOrMoreRoles([{Name:'horse'},{Name:rolestovify[0]}],rolestovify));//返回true
您要查找的是两个集合是否有交集–仅此情况下,您不关心特定的交集值–您只关心集合X中的某个元素是否与集合Y中的某个元素匹配

这也是用函数编程标记的,所以我们使用表达式而不是语句

// hasIntersection :: ([a], [a]) -> Boolean
const hasIntersection = (xs = [], ys = [], x = 0, y = 0) =>
  y === ys.length
    ? false
    : x === xs.length
      ? hasIntersection (xs, ys, 0, y + 1)
      : xs [x] === ys [y] || hasIntersection (xs, ys, x + 1, y)

console.log (hasIntersection ([1, 2, 3], [4, 5, 6])) // false
console.log (hasIntersection ([1, 2, 3], [4, 1, 6])) // true
console.log (hasIntersection ([1, 2, 3], []))        // false
console.log (hasIntersection ([], [4, 5, 6]))        // false
console.log (hasIntersection ([], []))               // false
输入数组可以有任何类型的值–这里的角色是整数,但您可以使用字符串或其他您想要的类型

const rolestovify=[“系统管理员”、“工资单”];
键入CrmRole={Name:string};
函数userHasOneOrMoreRoles(currentUserRoles:CrmRole[],rolesToVerify:String[]){
for(让currentUserRole的currentUserRole){
让roleExists=roleToVerify.some(roleToVerify=>currentUserRole.Name==roleToVerify);
如果(roleExists){
返回角色存在;
}
}
返回false;
}
log(userHasOneOrMoreRoles([{Name:'horse'}],rolestovify));//返回false
log(userHasOneOrMoreRoles([{Name:'horse'},{Name:'cow'}],rolestovify));//返回false
log(userHasOneOrMoreRoles([{Name:rolesToVerify[0]}],rolesToVerify));//返回true

log(userHasOneOrMoreRoles([{Name:'horse'},{Name:rolestovify[0]}],rolestovify));//返回true
我将您的代码复制并粘贴到repl.it中,它甚至不是有效的语法您有一个与全局变量同名的参数
rolestovify
。这看起来更像是TypeScript而不是Javascript。请提供如何调用
userHasOneOrMoreRoles
rolesToVerify
被定义两次应该不会有什么区别,因为它在两个不同的范围内(尽管它会更干净,名称不同)。可能发生的情况是,未正确调用
userHasOneOrMoreRoles
。如何调用
userHasOneOrMoreRoles()
?你通过第二个论点了吗?阿德林,我的大部分答案都涉及递归——让我知道你是否能帮上更多的忙^_^
// hasIntersection :: ([a], [a]) -> Boolean
const hasIntersection = (xs = [], ys = [], x = 0, y = 0) =>
  y === ys.length
    ? false
    : x === xs.length
      ? hasIntersection (xs, ys, 0, y + 1)
      : xs [x] === ys [y] || hasIntersection (xs, ys, x + 1, y)

console.log (hasIntersection ([1, 2, 3], [4, 5, 6])) // false
console.log (hasIntersection ([1, 2, 3], [4, 1, 6])) // true
console.log (hasIntersection ([1, 2, 3], []))        // false
console.log (hasIntersection ([], [4, 5, 6]))        // false
console.log (hasIntersection ([], []))               // false