Javascript 使用前缀值和通配符查找对象

Javascript 使用前缀值和通配符查找对象,javascript,jquery,object,lodash,Javascript,Jquery,Object,Lodash,我有一个页面,生成3个带有前缀和数字的对象 数字每次都会更改,但前缀将始终保持不变 看起来是这样的: window.ctx8 window.ctx9 window.ctx10 Object.keys(window).filter(x => _.startsWith(x, "ctx")) 在我的页面上,我有3个列表,每个列表对应一个对象,我需要使用 window.["ctx" + ?NUMBER? ].selectedItems 如何通过窗口对象有效地找到这3个对象 编辑:我无法控

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

数字每次都会更改,但前缀将始终保持不变

看起来是这样的:

window.ctx8

window.ctx9

window.ctx10
Object.keys(window).filter(x => _.startsWith(x, "ctx"))
在我的页面上,我有3个列表,每个列表对应一个对象,我需要使用

window.["ctx" + ?NUMBER? ].selectedItems
如何通过窗口对象有效地找到这3个对象

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

我试过这样的方法:

window.ctx8

window.ctx9

window.ctx10
Object.keys(window).filter(x => _.startsWith(x, "ctx"))
但我不知道如何进一步过滤
随机数


也许我可以做一个长度比较,因为它通常是一个介于0-99之间的数字。

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

var ctxNames = Object.keys(window).filter(function(v) { return /^ctx\d+$/.test(v) })
// ctxNames is now ["ctx8", "ctx9", "ctx10"]
也就是说,使用正则表达式匹配“ctx”,后跟一个或多个数字


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

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

var ctxNames = Object.keys(window).filter(function(v) { return /^ctx\d+$/.test(v) })
// ctxNames is now ["ctx8", "ctx9", "ctx10"]
也就是说,使用正则表达式匹配“ctx”,后跟一个或多个数字



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

@AndrewLi-关键是OP不知道
数字是什么,只是名为
“ctx”
加上一些数字的属性/变量将存在。我将把它放在另一个对象中,因为
窗口
有其他属性,这可能会使in循环的时间更长,但
窗口
之后不应该有
。您可以使用for-in循环在任何对象上循环,只是不要期望结果的顺序符合您的要求。@nnnnnnnn,谢谢,是的,我不知道属性名称,但我知道它以ctx+“随机数”开头@PHPglue不幸的是,我无法控制应用程序的这一方面。我会在实施糟糕的设计之前与上级沟通。@AndrewLi-问题是OP不知道什么是
数字,只是名为
“ctx”
的属性/变量加上一些数字就存在了。我会把它放在另一个对象中,因为
窗口
具有其他属性,这可能会使循环中所需的时间更长,但是
窗口
之后不应该有
。您可以使用for-in循环在任何对象上循环,只是不要期望结果的顺序符合您的要求。@nnnnnnnn,谢谢,是的,我不知道属性名称,但我知道它以ctx+“随机数”开头@不幸的是,我无法控制应用程序的这一方面。在实施糟糕的设计之前,我会与上级沟通。这非常有效。我想做一个长度文本,但正则表达式是首选。你能提供一个例子,说明你在编辑中的意思吗
在变量中声明正则表达式
你的意思是这样的吗
var textCtx=function(prop){return/^ctx\d+/.test(prop)}
then
var ctxs=Object.keys(window.filter)(textCtx})
我认为没有必要,因为即使
window
有20000个属性,原样的代码运行速度也相当快(它似乎不超过几百个),但我的意思是像
var regex=/^ctx\d+$/
,然后在函数中使用
return regex.test(v)
@Batman为什么要使用
窗口而不是其他窗口(空)对象作为包装器?如果将变量包装在一个空对象中,速度会快得多(然后,如果需要,将该对象添加到
窗口中
)@ibrahimmahrir和@PHPglue-我想我们都同意不依赖globals会更好,但如果这是因为OP无法控制的事情而需要的话,那么底线是,即使是几百万个属性也可以在几百毫秒内用正则表达式过滤,并且实际正常数量的
窗口
是正确的领带(比如,当前SO页面上的几百条)可以在不到一毫秒的时间内进行过滤-不是每个都是一毫秒,但总的来说…效果非常好。我想做一个长度文本,但更喜欢正则表达式。你能提供一个例子说明你在编辑中的意思吗?
在变量中声明正则表达式
你的意思是这样的吗
var textCtx=function(prop){return/^ctx\d+/.test(prop)}
然后
var-ctxs=Object.keys(window.filter(textCtx})
我认为这是没有必要的,因为即使
window
有20000个属性(而且似乎不超过几百个属性),代码也会运行得相当快,但我的意思是类似于
var regex=/^ctx\d+$/
,然后在函数中使用
return regex.test(v)
@Batman为什么要使用
窗口而不是其他(空)对象作为包装器?如果将变量包装在空对象中,速度会快得多(然后,如果需要,将该对象添加到
窗口中
)@ibrahimmahrir和@PHPglue-我想我们都同意不依赖globals会更好,但如果这是因为OP无法控制的事情而需要的话,那么底线是,即使是几百万个属性也可以在几百毫秒内用正则表达式过滤,并且实际正常数量的
窗口
是正确的可以在不到一毫秒的时间内过滤领带(比如,当前SO页面上的几百条领带)——不是每一条都过滤一毫秒,而是总共过滤一毫秒。。。