【问题标题】:Matching all values, substitute to OR operator匹配所有值,替换为 OR 运算符
【发布时间】:2014-01-23 17:26:41
【问题描述】:

这是按预期工作的第一个代码示例:在其余代码中,这用作过滤器,并将匹配来自 myids 的 2 个项目,即 objectId 与 tWOsQhsP2Z 和 sStYrIU6lJ 匹配的 2 个项目:

return  myids.objectId === "tWOsQhsP2Z" || myids.objectId === "sStYrIU6lJ";

因为我需要从数组中传递任意数量的 id,所以我正在尝试像这样重构代码:

return  myids.objectId === ("tWOsQhsP2Z" || "sStYrIU6lJ");

这个新代码的问题是使用返回值的过滤器将只返回一项,即 objectId 为 tWOsQhsP2Z 的一项。

您知道如何重构第二个代码,以便保留单个代码“myids.objectId”但返回所有 objectIds 值的匹配项吗?

【问题讨论】:

  • 你可以使用某种形式的“包含?”在 JS 中,例如,将选项放在一个数组中,然后查看 objectId 是否包含在该数组中。您可以手动执行此操作,也可以使用为您提供此功能的多个库中的任何一个,例如 lo-dash、下划线、jQuery 等。
  • (["tWOsQhsP2Z", "sStYrIU6lJ"].indexOf(myids.objectId) != -1)
  • 如果 ID 在数组中,我不明白 === ("tWOsQhsP2Z" || "sStYrIU6lJ") 是如何关联的,因为它显示了硬编码的值。您是说要搜索数组吗?如果是这样,您是否正在寻找答案,因为这是一项非常常见的任务。
  • 可能与此重复:short hand for chaining logical operators in javascript? ...或为此:Best way to find an item in a JavaScript array? 只需一点点努力即可轻松找到两个答案。

标签: javascript


【解决方案1】:

听起来你需要类似 underscore.js contains() 的方法,这会让事情变得更简单。

例如

return _.contains(arrayOfIds, myids.objectId);

【讨论】:

  • 这正是我想要做的,并且有效,谢谢,我看看我是否可以在没有下划线的情况下做到这一点
  • 如果您正在使用数组并且不想使用下划线,那么您可以只使用 indexOf 例如return (arrayOfIds.indexOf(myids.objectId) !== -1);
【解决方案2】:

您可以使用switch

switch (myids.objectId) {
  case "tWOsQhsP2Z":
  case "sStYrIU6lJ":
    return true;
}
return false;

【讨论】:

  • 这对于任意长度的 ID 数组是不切实际的。我认为这就是 OP 所要求的。
  • @cookiemonster:好吧,也许 OP 打算问这个问题,但实际上并没有接近...
  • 是的,好吧 “因为我需要从数组中传递任意数量的 id” 听起来很清楚,但是 OP 在解决方案中的“尝试”没有意义。
【解决方案3】:

如果您有一个要搜索的数组 值,并且列表很长和/或您经常搜索,则可以将列表转换为对象,然后进行属性查找。通过数组搜索效率更高。

对于一个简单的常量情况,您的示例如下所示:

return  myids.objectId in {"tWOsQhsP2Z": 1, "sStYrIU6lJ": 1};

如果您从服务器生成或动态的数组开始:

var knownIds = [ ... ];

然后您可以将其转换为地图:

var idMap = knownIds.reduce(function(m, v) {
  m[v] = 1;
  return m;
}, {});

现在您的查找将很简单:

return myids.objectId in idMap;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-17
    • 1970-01-01
    • 2013-11-18
    • 1970-01-01
    • 2016-06-17
    • 2016-09-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多