2011-12-25 33 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