2011-12-25 68 views
1

匹配钥匙从JSON对象中检索值我有以下的JavaScript对象文字(节选)JavaScript的使用正则表达式

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

我有以下查询:

var query = "hello" 

我想调用foo [查询]获得值100,但有一个[35]我不一定知道它的值。我确信我会得到一场独特的比赛。有没有什么方法可以输入查询是某种JavaScript正则表达式?即

Regex = /hello/ 
foo[Regex] 
100 

赦免noob问题...

回答

5

你有什么在这里:

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

JSON,这是一个对象的字符串表示;你有什么是一个对象文字,它创建一个实际的JavaScript对象。据我所知,通过将属性名称与正则表达式匹配来从对象中检索值的唯一方法是枚举属性名称并测试每个属性名称。你需要的正则表达式是这样的:

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

...这将对阵“你好”任选随后在方括号中的零个或多个数字。但是,你不想硬编码“你好”因为你还(大概)所需要的“再见”的值,所以使用功能:

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) 

演示:http://jsfiddle.net/asDQm/

+0

谢谢。 darn,我希望在那里它是一个快速的一行事情,所以我不必搜索自己的JavaScript对象字面量 – ejang 2011-12-25 18:32:54

+0

一旦你有一个对象没有一行 - 这就是为什么我会写它作为一个函数。但是,你是通过解析JSON字符串来创建对象吗?如果是这样,你可以做一次性的查找/替换_before_解析它以删除方括号中的位。 – nnnnnn 2011-12-25 23:10:08

0

我小白这里太多,但我已经看到了这page以前看到它可以帮助你与你的问题。它基本上解释了JSon路径。另请参阅此question

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

+0

JavaScript的绝对支持正则表达式,但为简单的非正则表达式解决方案+1。 (当然这里假定不会有像“hellothere [62]”或“shelloil [19]”这样的属性,所以测试'key.indexOf(query +“[”)== = 0')。这是正则表达式的版本,我的过于复杂的答案提供。 – nnnnnn 2011-12-25 11:21:01

+0

可能会解决那个与indexOf(查询)== 0或许 – 2011-12-25 11:24:11

+0

是的。对不起,我想我正在编辑我的评论,在您输入评论的同时说出类似的话。 – nnnnnn 2011-12-25 11:28:05

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

需要注意的是,你可以在你的正则表达式,而不是使用“你好”一个变种。

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 
+0

你最初的'foo'声明是一个对象字面值,而不是一个字符串(而不是JSON)。这很好,因为这就是问题所在,但不好,因为这意味着你不能在其上使用字符串'.replace()'方法。 – nnnnnn 2011-12-25 11:15:19

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

在你的函数中你应该说's.match()' - 除非它不起作用,因为'foo'不是一个字符串... – nnnnnn 2011-12-25 12:08:14

+0

忘记了改变。谢谢 :) – Diode 2011-12-25 12:12:02