如何查找名称与给定正则表达式匹配的所有属性?

时间:2016-10-09 05:32:56

标签: javascript

如何查找与给定正则表达式匹配的所有属性名称?

我们假设有一个对象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;

2 个答案:

答案 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中引入的标准回调数组方法之一,包括forEachevery等。非常有用,也很有用。

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中使用函数。