如何查找与给定正则表达式匹配的所有属性名称?
我们假设有一个对象PFK
有一个名为Development
的属性,如何通过搜索Job Title, Software, Staff
来找到此属性?
问题在于我也不知道Development
的名称是什么。
控制台中的示例:
SELECT DISTINCT FirstName, LastName, COUNT(*) AS numProjects
FROM Staff
INNER JOIN Development ON Staff.StaffID = Development.StaffID
INNER JOIN JobTitle ON Development.JobTitleID = JobTitle.JobTitleID
WHERE JobName = 'Software Developer'
GROUP BY FirstName, LastName;
答案 0 :(得分:3)
我写了一个内衬来搜索对象的键内的部分字符串 (o是对象,也是术语)
Object.keys(o).find(function(q){return /very/gi.test(q)})
可用于当然的功能
function searchObject(_object,term){
var query = new RegExp(term,'i');
return Object.keys(_object).find(function(q){return query.test(q)})
}
希望有所帮助
<强>更新强>
由于OP想要搜索object和var,我编写了一个函数,用于搜索所有窗口变量,查找包含该术语的属性键的对象。function searchForObjectByPartialKey(term){
var query = new RegExp(term,'i');
var keys = Object.keys(window);
var results = [];
keys.forEach(function(varName,i){
var windowObj = window[varName];
if (windowObj && typeof windowObj === 'object'){
var variable = Object.keys(windowObj).filter(function(q){return query.test(q)});
if(variable.length){
results.push({props:variable,obj:varName})
}
}
})
return results;
}
它返回'props'对象数组(属性键名)和'obj'(对象名称)
答案 1 :(得分:1)
如何找到与给定正则表达式匹配的所有变量名?
你的意思是“属性”,而不是“变量”。变量是存在于某个范围顶部的名称。没有办法枚举变量(除非你的意思是全局变量,它实际上是window
对象的属性)。 {}
对象中的“事物”(键/值对)称为属性。差异很重要。顺便说一句,这与Chrome无关。它可以在任何浏览器的任何引擎中以相同的方式工作。
问题在于我也不知道
o
的名称是什么。
然后你运气不好。正如我所说,除了全局变量之外,没有办法枚举变量,但是你没有使用它们,对吧?无论如何,为什么你会忘记自己的变量?
遍历属性,检查每个属性,如果匹配,则将其添加到结果中:
const results = [];
for (let prop in obj) if (/very/.test(prop)) results.push(prop);
这里我们使用for...in
语句循环对象的属性。如果你还不知道,你应该学习这个表格。然后我们使用RegExp.test
来测试匹配。这是RegExp
上常见,有用的方法,你也应该学习。我假设你熟悉数组以及如何将push
元素放到它们上面。
你可以把它变成一个函数,传入要检查的对象和匹配的模式:
function getMatchingProps(obj, pattern) {
const results = [];
for (let prop in obj) if (pattern/.test(prop)) results.push(prop);
return results;
}
getMatchingProps(obj, /very/);
稍微更“实用”的方法是使用Object.keys()
获取密钥列表:
const keys = Object.keys(obj);
然后使用filter
来提取匹配的内容。 filter
是ES5中引入的标准回调数组方法之一,包括forEach
,every
等。非常有用,也很有用。
keys.filter(key => pattern.test(key))
以函数形式:
function getMatchingProps(obj, pattern) {
return Object.keys(obj).filter(key => pattern.test(key));
}
此处=>
是一个arrow function,这是ES6中引入的一项新功能,它使得编写小功能更加紧凑。如果由于某种原因,您的环境中没有可用的箭头功能,则可以将其写为function(key) { return pattern.test(key); }
。
我可以通过定义为给定模式创建“匹配器”的方法来扩展此解决方案,然后我可以使用它来匹配任何对象:
function makeMatcher(pattern) {
return function(obj) {
return Object.keys(obj).filter(key => pattern.test(key));
};
}
现在
const matchVery = makeMatcher(/very/);
console.log(matchVery(obj1), matchVery(obj2));
如果你可以围绕这个 - 一个返回一个函数的函数 - 你正在逐步理解在JS中使用函数。