【问题标题】:Disable button based on string length range根据字符串长度范围禁用按钮
【发布时间】:2022-11-11 01:03:21
【问题描述】:

我有一个输入字段和一个按钮。该按钮应在以下简单场景中启用:

  • 输入长度等于 10,或
  • 输入长度大于 15(应禁用 11 到 14)。

我试过!str.length = 10 || !str.length >= 15,但这些条件都失败了,因为这两种情况之间存在冲突。我知道我可以检查长度是否不等于 11、12、13 或 14,但这看起来不太好。任何更好的解决方案将不胜感激。

【问题讨论】:

  • 试试这个条件 str.length > 14 && str.length === 10
  • 禁用 = !(str.length == 10 || str.length >=15)
  • 您能否发送一个更完整的代码示例?
  • 表达它只有两种选择......从字面上遵循OP的标准......“...按钮应该是启用on ... - 输入长度等于 10 [OR] 输入长度大于 15"...enabled: (str.length > 15 || str.length === 10)。相反或否定,禁用,然后是 ...disabled: (str.length <= 15 && str.length !== 10) 而不是 OP 放入括号中的内容...“(应该禁用 11 到 14)”...因为这已经是别的东西了。
  • @Shareer -“...(应该禁用 11 到 14)...”不是否定...“应该启用 [for]”... (“输入长度等于 10”OR“输入长度大于 15”)

标签: javascript conditional-statements comparison boolean-logic demorgans-law


【解决方案1】:

尝试:

!(str.length == 10 || str.length > 15)

编辑

当需要禁用按钮时返回 true,当不需要禁用按钮时返回 false。

@Peter Seliger 为什么这个解决方案不好?

【讨论】:

  • 请考虑更新或删除您的答案,因为上述建议的解决方案不满足任何 OP 的用例(甚至是模糊的用例)。@谁投了赞成票...在投票之前,应该阅读一个关键的答案,也许还可以对提议的解决方案进行一些简单的测试。
  • 请使用 cmets 部分而不是问题的编辑功能...“[at]PeterSeliger 为什么这个解决方案不好?”...因为它不符合任何 OP 的用例/规范/条件。 ...“当需要禁用按钮时返回 true,当不需要禁用按钮时返回 false。”... 不,不是的。请参阅我对此主题的回答,包括您的方法也被执行的测试用例。我怀疑上面的实现是否已经被它的创建者测试过。
  • 好吧,我错了,我以为可以是15。
  • 我相应地调整了测试用例。您更改的功能现在符合 OP 原始的反转/否定规范启用规格;因此,您当前的禁用检查符合上述情况,但不符合 OP 的不同禁用规范,这不是实施的错误,而是归咎于 OP 的非精确表述禁用.
【解决方案2】:

您在第一个条件中使用了单个等号 =,它用于环境变量,不检查它们是什么。它需要是=====,在这种情况下,=== 是首选,因为== 用于在两种不同类型(例如字符串、整数)之间进行检查。
应该:

(!str.length === 10 || !str.length >= 15)

编辑:
似乎有必要说明,尽管 OP 说如果等于 10 或“应该启用它”比...更棒15”,OP 明确表示等于或大于15,因为 OP 通过说“(应该在 11 到 14 之间禁用)”,输入“>= 15”并再次说,“不等于 11、12、13 或14."

【讨论】:

  • 你是说@Lima 的那个吗?我这样做是因为它在技术上是正确的,并且可以解决问题。然而,我随后发布了我自己的、更连贯、更有帮助和准确的答案。但这对你来说真的不重要;这是我的事。 ?
  • 请考虑更新或删除您的答案,因为上述建议的解决方案不满足任何 OP 的用例(甚至是模糊的用例)。@谁投了赞成票...在投票之前,应该阅读一个关键的答案,也许还可以对提议的解决方案进行一些简单的测试。
【解决方案3】:

OP 的模糊规范启用条件和另一个不同的条件为了禁用这是不是对前者的否定以及对利马'沙罗伯特·布拉德利除了我的原始评论之外,我的答案确实强制我单独的答案和测试用例。

  • 只有两种表达方式...严格遵循 OP 的标准...
    • “...按钮应该是启用上 ...

      • 输入长度等于 10
      • [OR] 输入长度大于 15" ...

      启用:(str.length > 15 || str.length === 10)

    • 反之还是negation禁用, 那么是...

      禁用:(str.length <= 15 && str.length !== 10)

      ...而不是 OP 放入括号中的内容 ...“(应该禁用 11 到 14)”... 因为这已经是另一回事了。

在任何配置中运行两者的建议解决方案利马罗伯特·布拉德利他们的实现总是失败,因为使用的条件从不匹配任何用例启用也不为否定启用也不针对 OP 的特定/特殊禁用.

function isEnabledAccordingToOpsSpecification(str) {
  return (str.length > 15 || str.length === 10);
}
function isDisabledAccordingToOpsSpecAndDeMorgansLaws(str) {
  // De Morgan's laws - (From Wikipedia, the free encyclopedia)
  // see ... [https://en.wikipedia.org/wiki/De_Morgan%27s_laws]
  return (str.length <= 15 && str.length !== 10);
}


function isDisabledAccordingToAnotherOpsSpec(str) {
  return (str.length >= 11 && str.length <= 14);
}

function isDisabledAccordingToUserRobertBradley(str) {
  return (!str.length === 10 || !str.length >= 15);
}

function isDisabledAccordingToUserLima(str) {
  return !(str.length == 10 || str.length >= 15);
}

// after Lima's changes/edit.
function isDisabledAccordingToUserLimaAfterAppliedFix(str) {
  return !(str.length == 10 || str.length > 15);
}
function isEnabledAccordingToUserLimaAfterAppliedFix(str) {
  return (str.length == 10 || str.length > 15);
}


const enabledTestConfigAccordingToOpsSpec = [
  ['01234567', false],
  ['012345678', false],
  ['0123456789', true],         // length ... "equal to 10"
  ['0123456789a', false],
  ['0123456789ab', false],
  ['0123456789abc', false],
  ['0123456789abcd', false],
  ['0123456789abcde', false],   // length ... "equal to 15"
  ['0123456789abcdef', true],   // length ... "greater than 15"
  ['0123456789abcdef0', true],  // length ... "greater than 15"
  ['0123456789abcdef01', true], // length ... "greater than 15"
];

console.log(
  '- all tests passed for OP's "enabled" specification ?..',
  enabledTestConfigAccordingToOpsSpec
    .every(([str, expectedValue]) =>
      expectedValue === isEnabledAccordingToOpsSpecification(str)
    )
);
console.log(
  '- all tests passed for OP's negated (De Morgan's laws) "enabled" specification ?..',
  enabledTestConfigAccordingToOpsSpec
    .every(([str, expectedValue]) =>
      expectedValue !== isDisabledAccordingToOpsSpecAndDeMorgansLaws(str)
    //!expectedValue === isDisabledAccordingToOpsSpecAndDeMorgansLaws(str)
    )
);


const disabledTestConfigAccordingToAnotherOpsSpec = [
  ['01234567', false],
  ['012345678', false],
  ['0123456789', false],
  ['0123456789a', true],        // length ... "equal to 11"
  ['0123456789ab', true],       // length ... "equal to 12"
  ['0123456789abc', true],      // length ... "equal to 13"
  ['0123456789abcd', true],     // length ... "equal to 14"
  ['0123456789abcde', false],
  ['0123456789abcdef', false],
  ['0123456789abcdef0', false],
  ['0123456789abcdef01', false],
];

console.log(
  '
- all tests passed for another OP's specific "disabled" specification ?..',
  disabledTestConfigAccordingToAnotherOpsSpec
    .every(([str, expectedValue]) =>
      expectedValue === isDisabledAccordingToAnotherOpsSpec(str)
    )
);

console.log(
  '
... disabled according to the negated OP's "enabled" specification ...
- all tests passed for another OP's specific "disabled" specification ?..',
  disabledTestConfigAccordingToAnotherOpsSpec
    .every(([str, expectedValue]) =>
      expectedValue === isDisabledAccordingToOpsSpecAndDeMorgansLaws(str)
    )
);

console.log(
  '
... disabled according to user Robert Bradley ...
- all tests passed for another OP's specific "disabled" specification ?..',
  disabledTestConfigAccordingToAnotherOpsSpec
    .every(([str, expectedValue]) =>
      expectedValue === isDisabledAccordingToUserRobertBradley(str)
    )
);
console.log(
  '
... disabled according to user Lima ...
- all tests passed for another OP's specific "disabled" specification ?..',
  disabledTestConfigAccordingToAnotherOpsSpec
    .every(([str, expectedValue]) =>
      expectedValue === isDisabledAccordingToUserLima(str)
    )
);


console.log('

+++ Running Robert's and  Lima's implementations in all other test scenarios in case the intention of each implementation has been gotten wrong +++');

console.log([
  'Robert',

  disabledTestConfigAccordingToAnotherOpsSpec
    .every(([str, expectedValue]) =>
      expectedValue !== isDisabledAccordingToUserRobertBradley(str)
    ),

  enabledTestConfigAccordingToOpsSpec
    .every(([str, expectedValue]) =>
      expectedValue === isDisabledAccordingToUserRobertBradley(str)
    ),
  enabledTestConfigAccordingToOpsSpec
    .every(([str, expectedValue]) =>
      expectedValue !== isDisabledAccordingToUserRobertBradley(str)
    //!expectedValue === isDisabledAccordingToUserRobertBradley(str)
    ),
].join(' ... '));

console.log([
  'Lima',

  disabledTestConfigAccordingToAnotherOpsSpec
    .every(([str, expectedValue]) =>
      expectedValue !== isDisabledAccordingToUserLima(str)
    ),

  enabledTestConfigAccordingToOpsSpec
    .every(([str, expectedValue]) =>
      expectedValue === isDisabledAccordingToUserLima(str)
    ),
  enabledTestConfigAccordingToOpsSpec
    .every(([str, expectedValue]) =>
      expectedValue !== isDisabledAccordingToUserLima(str)
    //!expectedValue === isDisabledAccordingToUserLima(str)
    ),
].join(' ... '));

console.log('
Lima ... after having applied the fixes ...');
console.log(
  '- all tests passed for OP's "enabled" specification ?..',
  enabledTestConfigAccordingToOpsSpec
    .every(([str, expectedValue]) =>
      expectedValue === isEnabledAccordingToUserLimaAfterAppliedFix(str)
    )
);
console.log(
  '- all tests passed for OP's negated "enabled" specification ?..',
  enabledTestConfigAccordingToOpsSpec
    .every(([str, expectedValue]) =>
      expectedValue !== isDisabledAccordingToUserLimaAfterAppliedFix(str)
    //!expectedValue === isDisabledAccordingToUserLimaAfterAppliedFix(str)
    )
);
.as-console-wrapper { min-height: 100%!important; top: 0; }

编辑在 Lima 提出实施修复后

我相应地调整了测试用例。 Lima 的改变函数现在符合 OP 原始的反转/否定规范启用规格;因此 Lima 的当前禁用检查符合上述情况,但不符合 OP 的不同禁用规范,这不是 Lima 更新实现的错,而是归咎于OP的非精确表述禁用.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-21
    • 1970-01-01
    • 2012-01-19
    • 2016-07-08
    • 2013-11-25
    • 2020-06-28
    • 2017-07-18
    相关资源
    最近更新 更多