【问题标题】:return boolean based on object condition inside array of objects根据对象数组内的对象条件返回布尔值
【发布时间】:2020-09-18 10:21:17
【问题描述】:

我觉得这是一个非常简单的问题,但过去几个小时我一直在努力解决这个问题..

    data[0].fieldArray.fieldGroup[4].hideExpression = (model: any, formState: any) => {
      for (const item of formState.mainModel.config.linkItems) {
        console.log(item);
        if (item.displaySubmenu) {
          return false;
        } else {
          return true;
        }
      }
    };

我的 formState 包含一个内部包含多个对象的数组,我需要确定每个对象(displaySubmenu)内部的值是 true 还是 false 并返回 true 或 false 以触发 hideExpression .. 到目前为止,我只设法要么触发页面上的所有元素,要么触发第一个或最后一个元素..

我也尝试过使用 forEach, map,但我觉得我错过了一些非常简单的东西,只是不明白是什么

【问题讨论】:

    标签: javascript arrays typescript angular-formly ngx-formly


    【解决方案1】:

    您可以为此使用 array.filter 方法:

    data[0].fieldArray.fieldGroup[4].hideExpression = (model: any, formState: any) => {
      return formState.mainModel.config.linkItems.filter(linkItem => {
        return linkItem.displaySubmenu;
      }).length > 0;
    };
    

    filter 方法返回一个包含符合条件的项目的数组。如果 linkItems 中的某个项目的 displaySubmenu 为 true,它将在 filter 方法的返回数组中返回。因此,当我们获得该数组的长度时,它将大于 0,从而产生一个真正的布尔值。

    当 linkItems 没有带有 displaySubmenu 的项目时,返回过滤器将返回一个空数组,因为没有任何项目符合条件并且长度将为 0,这会导致布尔值错误。

    有关过滤方法的更多信息:https://developer.mozilla.org/nl/docs/Web/JavaScript/Reference/Global_Objects/Array/filter

    【讨论】:

    • 我也尝试过使用过滤器,我发现这个解决方案有 2 个问题。一个是如果我在页面上有超过 1 个复选框,所有这些都会被触发:/第二个,当 displaySubmenus 为 false 时显示所有字段
    • 您是否有 HTML 示例以及 displaySubmenus 和 hideExpression 的实现如何影响复选框?
    猜你喜欢
    • 1970-01-01
    • 2019-10-09
    • 2020-04-23
    • 2021-04-09
    • 2020-08-23
    • 1970-01-01
    • 2020-03-24
    • 2021-05-18
    • 1970-01-01
    相关资源
    最近更新 更多