【问题标题】:Check if value is in array and return true or false angular 6+检查值是否在数组中并返回真或假角度 6+
【发布时间】:2019-07-01 08:50:05
【问题描述】:

我有一些这样的数组

roles = ['AnyRulesGo@admin', 'NoRules@admin', 'HowYesNo@history', 'MamaMia@survey'];

我有一些像这样的对象

 externalLinks = [
    {
      link: '#',
      icon: 'Icon',
      translation: 'Home',
      role: '@history',
      active: false,
      visible: false
    },
    {
      link: '#',
      icon: 'Task',
      translation: 'Tasks',
      role: '@task',
      active: false,
      visible: false
    },
    {
      link: '#',
      icon: 'Files',
      translation: 'Files',
      role: '@admin',
      active: true,
      visible: false
    }
  ];

我需要一些函数来检查 externaLinks 中的值 role 是否存在于数组 roles 中,并从 更新 externalLinks 中的值 visible >falsetrue

我没有更多的代码,因为我什至不知道从哪里开始,任何帮助都会很棒,谢谢

其中一个问题是我的网络角色名称只从@开始,这意味着我需要剪掉那个字符串,然后进行比较?

我试过这个功能,但没有成功

function objectsAreSame(x, y) {
   var objectsAreSame = true;
   for(var propertyName in x) {
      if(x[propertyName] !== y[propertyName]) {
         objectsAreSame = false;
         break;
      }
   }
   return objectsAreSame;
}

【问题讨论】:

  • 到目前为止您尝试过什么?您能添加您当前的尝试吗?
  • 角色数组值和对象属性角色的 externalLinks 数组应该相等不是你的问题没有对象属性匹配任何角色数组
  • AnyRulesGo@admin 只能是@admin 才可以查看属性
  • 我需要比较活动中的角色值是否存在于数组角色中?
  • @DILEEPTHOMAS 实际上他们没有,您可以检查一个字符串是否包含另一个

标签: javascript arrays angular typescript ecmascript-6


【解决方案1】:

您可以使用array#forEach 遍历externalLinks 中的每个对象。然后使用array#somestring#incldues 检查roles 数组中的角色,并更新visible 键的值。

let roles = ['AnyRulesGo@admin', 'NoRules@admin', 'HowYesNo@history', 'MamaMia@survey'],
    externalLinks = [ { link: '#', icon: 'Icon', translation: 'Home', role: '@history', active: false, visible: false }, { link: '#', icon: 'Task', translation: 'Tasks', role: '@task', active: false, visible: false }, { link: '#', icon: 'Files', translation: 'Files', role: '@admin', active: true, visible: false } ];

externalLinks.forEach(o => {
  o.visible = false;
  if(roles.some(r => r.includes(o.role)))
    o.visible = true;
});
console.log(externalLinks);

【讨论】:

  • 使用contains 将是更好/正确的方法,因为似乎只有Firefox 使用includes 方法
  • 可以参考这个answer。请分享contains方法的链接。
【解决方案2】:

您可以使用forEach 循环访问外部链接。然后使用someincludes 来检查角色是否存在。

roles = ['AnyRulesGo@admin', 'NoRules@admin', 'HowYesNo@history', 'MamaMia@survey'];

externalLinks.forEach((extLink) => {
  if(roles.some(role => role.includes(extLink.role))){
    extLink.visible = true;
  }
})

【讨论】:

  • 您可以在答案中添加角色数组吗?
  • 如果您使用问题的角色数组,我希望上面的 sn-p 不起作用,因为角色数组应该等于 extLink.role
  • 我不明白你的意思。 OP 要求检查 roles 数组是否包含 externalLink 角色。所以,这就是它的完成方式。
  • 在编辑之前,没有array.some和array.includes。编辑后,现在它可以工作了
  • 编辑前有includes,但没有提到使用some(代码存在)。但这不是重点。当然,我是根据 OP 提供的数据来回答这个问题的。我认为没有必要再次写入数据。如果您认为这个 sn-p 不起作用,那么请告诉我这个答案与唯一赞成的答案有何不同?
【解决方案3】:

做两个循环:

//Make all false
externalLinks.forEach(x=>x.visible=false);

//for each role, filter by role and forEach value filtered, make visible
role.forEach(role=>{
  let busc="@"+role.split('@')[1]
  externalLinks.filter(x=>x.role==busc)
      .forEach(xfilter=>xfilter.visible=true)
})
//If only want a role "roleSearch"
  let busc="@"+roleSearch.split('@')[1]
  externalLinks.filter(x=>x.role==busc)
      .forEach(xfilter=>xfilter.visible=true)

【讨论】:

  • 您可以通过使用contains 而不是拆分字符串来简化此操作
猜你喜欢
  • 2013-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-28
  • 2017-09-17
  • 1970-01-01
相关资源
最近更新 更多