Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javascript通过使用正则表达式匹配键从JSON对象检索值_Javascript_Regex - Fatal编程技术网

javascript通过使用正则表达式匹配键从JSON对象检索值

javascript通过使用正则表达式匹配键从JSON对象检索值,javascript,regex,Javascript,Regex,我有以下javascript对象文字(摘录) 我有以下疑问: var query = "hello" 我想调用foo[query]来获取值100,但有一个[35]我不一定知道的值。我确信我会得到一场独一无二的比赛。有没有办法输入查询是某种javascript正则表达式?i、 e Regex = /hello/ foo[Regex] 100 请原谅noob的问题…我也是noob,但我之前看到过这个,它可以帮助你回答问题。它基本上解释了JSon路径。也可以看到这一点。不确定是否可以在没有任何插件

我有以下javascript对象文字(摘录)

我有以下疑问:

var query = "hello"
我想调用foo[query]来获取值100,但有一个[35]我不一定知道的值。我确信我会得到一场独一无二的比赛。有没有办法输入查询是某种javascript正则表达式?i、 e

Regex = /hello/
foo[Regex]
100

请原谅noob的问题…

我也是noob,但我之前看到过这个,它可以帮助你回答问题。它基本上解释了JSon路径。也可以看到这一点。

不确定是否可以在没有任何插件的情况下使用regex。。。 这可能已经有帮助了

var foo = {"hello[35]":100,"goodbye[45]":42};
var query = "hello";
for(var key in foo){
    if (key.indexOf(query) > -1)
        document.write(foo[key]);
}

由于JSON是一个字符串,您可以将regexp与此类语句一起使用:

var foo = '{"hello[35]":100,"goodbye[45]":42}';
var result = foo.match(/"hello\[\d*\]":\d*/g);
result = result[0].split(":")[1];
alert(result);
看现场直播

请注意,您可以在regexp中使用var而不是“hello”。

这里的内容:

var foo = {"hello[35]":100,"goodbye[45]":42};

foo = foo.replace(/\[\d+\]/g,'');

var obj = (new Function("return "+foo))();

obj.hello -> 100

obj.goodbye -> 42

var query = 'hello';

obj[query] -> 100
var foo = {"hello[35]":100,"goodbye[45]":42};
不是JSON,它是对象的字符串表示形式;您拥有的是一个对象文本,它创建了一个实际的JavaScript对象。据我所知,通过将属性名与正则表达式匹配从对象检索值的唯一方法是枚举属性名并测试每个属性名。您需要的正则表达式如下所示:

/^hello(\[\d*\])?$/
…将与“hello”匹配,可选地后跟方括号中的零或多个数字。但您不想硬编码“hello”,因为您(可能)也需要“再见”值,所以请使用以下函数:

function getPropertyByRegex(obj,propName) {
   var re = new RegExp("^" + propName + "(\\[\\d*\\])?$"),
       key;
   for (key in obj)
      if (re.test(key))
         return obj[key];
   return null; // put your default "not found" return value here
}

var foo = {"hello[35]":100,"goodbye[45]":42};

alert(getPropertyByRegex(foo, "hello"));    // 100
alert(getPropertyByRegex(foo, "goodbye"));  // 42
alert(getPropertyByRegex(foo, "whatever")); // null (not found)

演示:

您最初的
foo
声明是一个对象文本,而不是字符串(也不是JSON)。这很好,因为这就是问题所在,但不好,因为这意味着不能对其使用string
.replace()
方法。JavaScript肯定支持正则表达式,但对于简单的非正则表达式解决方案,+1。(当然,这假设不存在“hellothere[62]”或“shelloil[19]”这样的属性,因此在
key.indexOf(query+“[”===0
上测试可能更可靠)这是我过于复杂的答案提供的正则表达式版本。是的。对不起,我想我在编辑我的评论时说了一些类似的话,同时你也在输入你的评论。确切地说:)你给了我同样的想法^^^在你的函数中你应该说
s.match()
-除非它无论如何都不会工作,因为
foo
不是一个字符串…谢谢。该死,我希望它是一个快速的单行程序,这样我就不必搜索javascript对象文本,一旦你有了对象,就没有一行程序了-这就是为什么我会将其作为函数编写。但是你是通过解析JSON字符串来创建对象的吗?如果是这样的话您可以在解析前执行一次性查找/替换,以删除方括号中的位。
function getPropertyByRegex(obj,propName) {
   var re = new RegExp("^" + propName + "(\\[\\d*\\])?$"),
       key;
   for (key in obj)
      if (re.test(key))
         return obj[key];
   return null; // put your default "not found" return value here
}

var foo = {"hello[35]":100,"goodbye[45]":42};

alert(getPropertyByRegex(foo, "hello"));    // 100
alert(getPropertyByRegex(foo, "goodbye"));  // 42
alert(getPropertyByRegex(foo, "whatever")); // null (not found)
function getVal(s, q){
   var r = s.match(new RegExp(q + "\\[\\d*\\]\":(\\d*)[\\,\\}]"));
   return r?r.pop():false;     
}
getVal(foo, "hello")