【问题标题】:Finding object using prefix value and wildcard使用前缀值和通配符查找对象
【发布时间】:2017-04-26 03:19:42
【问题描述】:

我有一个页面生成 3 个带有前缀和数字的对象。

数字每次都会更改,但前缀将始终保留。

看起来像这样:

window.ctx8

window.ctx9

window.ctx10

在我的页面上,我有 3 个列表,每个列表对应于其中 1 个对象,我需要使用

查找该列表中所选项目的值
window.["ctx" + ?NUMBER? ].selectedItems

如何通过 window 对象有效地找到这 3 个对象?

编辑:我无法控制这些对象的创建方式,它们是由应用程序创建的。

我尝试过这样的事情:

Object.keys(window).filter(x => _.startsWith(x, "ctx"))

但我不确定如何进一步过滤random number

也许我可以进行长度比较,因为它通常是 0-99 之间的数字。

【问题讨论】:

  • @AndrewLi - 关键是 OP 不知道 NUMBER 是什么,只是存在名为 "ctx" 的属性/变量加上 一些 数字。跨度>
  • 我会将它放在不同的对象中,因为window 具有其他属性,这可能会使循环中的所需时间更长,但在window 之后不应该有.。您可以使用 for in 循环遍历任何对象,只是不要期望结果按照您想要的顺序。
  • @nnnnnn,谢谢,是的,我不知道属性名称,但我知道它以 ctx + "random number" 开头
  • @PHPglue 不幸的是我无法控制应用程序的这方面
  • 在实施糟糕的设计之前,我会与上级沟通。

标签: javascript jquery object lodash


【解决方案1】:

将三个属性的名称作为数组获取的一种方法如下:

var ctxNames = Object.keys(window).filter(function(v) { return /^ctx\d+$/.test(v) })
// ctxNames is now ["ctx8", "ctx9", "ctx10"]

即使用正则表达式匹配“ctx”后跟一位或多位数字。

循环遍历window 的所有属性并不需要很长时间,但如果您愿意,可以通过在调用.filter() 之前在变量中声明正则表达式而不是创建新的正则表达式来提高代码效率回调中的对象。

【讨论】:

  • 这很好用。我正在考虑做一个长度文本,但首选正则表达式。
  • 您能否举例说明您在编辑中的意思? declaring the regex in a variable你的意思是这样的var textCtx = function(prop) { return /^ctx\d+/.test(prop) }然后var ctxs = Object.keys(window).filter(textCtx})
  • 我认为没有必要,因为即使 window 有 20,000 个属性(而且看起来更可能不超过几百个),代码仍然运行得相当快,但是我的意思是var regex = /^ctx\d+$/,然后在函数中使用return regex.test(v)
  • @Batman 为什么使用window 而不是其他(空)对象作为包装器?如果将 var 包装在一个空对象中会快得多(然后,如果需要,将该对象添加到 window 中)。
  • @ibrahimmahrir 和 @PHPglue - 我认为我们都同意不依赖全局变量会更好,但如果这是因为 OP 无法控制的事情而需要这样做,那么最重要的是,即使是几个百万个属性可以在几百毫秒内使用正则表达式进行过滤,而实际正常数量的window 属性(例如,在当前 SO 页面上的数百个类似)可以在不到一毫秒的时间内过滤 - 每个不是一毫秒, 但总共...
猜你喜欢
  • 2018-04-15
  • 2019-06-24
  • 1970-01-01
  • 2014-08-12
  • 2022-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多