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

3
我有以下JavaScript对象字面量(摘录)
var foo = {"hello[35]":100,"goodbye[45]":42};

我有以下查询:
var query = "hello"

我想调用foo [query]来获取值100,但是有一个[35],我不一定知道它的值。 我确定会得到唯一匹配。 有没有办法将查询输入为某种JavaScript正则表达式?例如。
Regex = /hello/
foo[Regex]
100

对不起,这是一个初学者的问题...
6个回答

6

你在这里看到的是:

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

它并不是JSON,JSON是对象的字符串表示;你拥有的是一个对象字面量,用于创建实际的JavaScript对象。据我所知,唯一能够通过匹配属性名与正则表达式检索对象值的方法是枚举属性名并测试每个属性。你需要使用类似如下的正则表达式:

/^hello(\[\d*\])?$/

...这将匹配以“hello”开头,后跟方括号中的零个或多个数字的内容。但是,您不希望硬编码“hello”,因为您还需要“goodbye”值(可能),因此请使用函数:

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)

Demo: http://jsfiddle.net/asDQm/


谢谢。该死,我原本希望这是一个快速的一行代码,以便我不必自己搜索JavaScript对象文字。 - ejang
没一个简洁的方法可以在创建对象之后再进行操作 - 这就是为什么我会将其写成一个函数。但是,你是通过解析 JSON 字符串来创建对象吗?如果是的话,你可以在解析之前进行一次性的查找/替换操作,以删除其中的方括号部分。 - nnnnnn

2

不确定是否可以在没有任何插件的情况下使用正则表达式... 这可能已经有所帮助了...

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]);
}

http://jsfiddle.net/3qqSr


JavaScript肯定支持正则表达式,但是对于一个简单的非正则表达式解决方案加1。(当然,这假设也不会有像“hellothere[62]”或“shelloil[19]”这样的属性,因此在key.indexOf(query + "[") === 0上进行测试可能更可靠。)这个问题的正则表达式版本是我过度复杂的答案提供的。 - nnnnnn
是的。抱歉,我想我正在编辑我的评论,与您输入评论的时间相似。 - nnnnnn
确切地说 :) 你给了我相同的想法 ^^ - Tim Vermaelen

0

我也是个新手,但之前看到过这个页面,希望它能帮助你解决问题。它基本上解释了JSon路径。还可以看看这个问题


0

由于您的JSON是一个字符串,因此您可以使用带有以下语句的正则表达式:

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

jsfiddle上实时查看。

请注意,您可以在正则表达式中使用变量而不是“hello”。


0
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

你最初的 foo 声明是一个对象字面量,而不是字符串(也不是 JSON)。这很好,因为这就是问题中的内容,但这也意味着你不能在它上面使用字符串 .replace() 方法。 - nnnnnn

0
function getVal(s, q){
   var r = s.match(new RegExp(q + "\\[\\d*\\]\":(\\d*)[\\,\\}]"));
   return r?r.pop():false;     
}
getVal(foo, "hello")

在你的函数中,你应该使用s.match()——但是它无论如何都不会起作用,因为foo不是一个字符串... - nnnnnn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接