Javascript一些嵌套在For中的方法

问题描述 投票:1回答:4

下面的代码我试图看看其中一个CrmRoles是否在rolesToVerify列表中,但是当我走过它时,我继续为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;
    }
javascript typescript functional-programming
4个回答
1
投票

你在一个循环内返回,独立于任何条件或任何东西。没有办法,你的循环超过第一次迭代。

//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;
}

要么

function userHasOneOrMoreRoles(currentUserRoles: CrmRole[], rolesToVerify: String[]) {
    return currentUserRoles.some(currentUserRole => rolesToVerify.includes(currentUserRole.Name));
}

1
投票

有两个问题。首先,你可能错误地调用你的函数导致我部分工作。

其次,你的代码中存在一个逻辑问题:当你迭代currentUserRoles数组时,你会在第一次迭代后执行return(除了第一个元素之外的其余元素将被忽略)。

以下是我的拙见:

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

type CrmRole = { Name: string };

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

    if (roleExists) {
      return roleExists;
    }
  }

  return false;
}

console.log(userHasOneOrMoreRoles([{Name: 'horse'}], rolesToVerify)); // Returns false
console.log(userHasOneOrMoreRoles([{Name: 'horse'}, {Name: 'cow'}], rolesToVerify)); // Returns false
console.log(userHasOneOrMoreRoles([{Name: rolesToVerify[0]}], rolesToVerify)); // Returns true
console.log(userHasOneOrMoreRoles([{Name: 'horse'}, {Name: rolesToVerify[0]}], rolesToVerify)); // Returns true

1
投票

你要找的是两个集合是否有一个交集 - 只是,在这种情况下你不关心特定的交叉值 - 你只关心集合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

输入数组可以具有任何类型的值 - 这里的角色是整数,但您可以使用字符串或您想要的其他类型


0
投票

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

type CrmRole = { Name: string };

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

    if (roleExists) {
      return roleExists;
    }
  }

  return false;
}

console.log(userHasOneOrMoreRoles([{Name: 'horse'}], rolesToVerify)); // Returns false
console.log(userHasOneOrMoreRoles([{Name: 'horse'}, {Name: 'cow'}], rolesToVerify)); // Returns false
console.log(userHasOneOrMoreRoles([{Name: rolesToVerify[0]}], rolesToVerify)); // Returns true
console.log(userHasOneOrMoreRoles([{Name: 'horse'}, {Name: rolesToVerify[0]}], rolesToVerify)); // Returns true

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

type CrmRole = { Name: string };

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

    if (roleExists) {
      return roleExists;
    }
  }

  return false;
}

console.log(userHasOneOrMoreRoles([{Name: 'horse'}], rolesToVerify)); // Returns false
console.log(userHasOneOrMoreRoles([{Name: 'horse'}, {Name: 'cow'}], rolesToVerify)); // Returns false
console.log(userHasOneOrMoreRoles([{Name: rolesToVerify[0]}], rolesToVerify)); // Returns true
console.log(userHasOneOrMoreRoles([{Name: 'horse'}, {Name: rolesToVerify[0]}], rolesToVerify)); // Returns true

我实际上最终得到了下面的代码,但循环中的返回是问题。

function userHasOneOrMoreRoles(currentUserRoles: CrmRole[], rolesToVerify: String[]) {
    for (let currentUserRole of currentUserRoles) {
        if (rolesToVerify.some(roleToVerify => currentUserRole.Name === roleToVerify)) {
            return true;
        }
    }
    return false;
}
© www.soinside.com 2019 - 2024. All rights reserved.