2012-11-30 98 views
2

是否有的JavaScript任何不是基於循環的方法JQuery的,可以從檢查對象的屬性一定價值的存在。我的意思是,如果我有查找對象的值

obj = { prop1:val, prop2:val2 } 

是可能的,也許一個語句檢查的OBJ值之間VAL2存在?

UPDATE 1:這裏的循環不是關鍵!我可以使用循環,如果它包裹在一些JQuery預定義的功能!

更新2: 我認爲寫一個手工功能並不是那麼高雅。我想找一些基於庫的解決方案來解決這個常見和常見的問題。

+2

簡答:不,您必須迭代對象,或者使用迭代對象的函數。 – zzzzBov

+0

取決於你正在嘗試做什麼。您是否試圖測試另一個對象的已知屬性的存在? –

+0

是的,那正是我想要做的! –

回答

4

不,你不能找到一個對象中的值是否存在於沒有循環的語句中。

您可以使用本地API或庫..但他們將內部循環所有值。

任何其他方法的收費將與迭代對象相同..所以我會寫一個簡單的for循環來做到這一點。

我只是簡單地在腳本文件中寫下這4行代碼,並且包含該腳本文件,而不是包含一個庫..這將是相同的。 http://jsfiddle.net/sQW4P/2/ < - 如果您需要這樣的功能,請將其套用。

+0

這裏的循環不是關鍵!如果包裝在某個JQuery預定義函數中,我可以使用循環! –

+0

@MichaelZ,那麼你需要澄清你的問題。 – zzzzBov

+0

@MichaelZ我不認爲jQuery中有這樣的功能。因此,如果您擔心網頁內部存在循環,請將其移至腳本文件,將其命名爲函數並調用該函數。我認爲它應該可以在其他一些庫中使用..但是爲此添加一個新庫是不行的。 –

0

我能想到的唯一方法是JSON:

new RegExp(':\"'+val+'\"').test(JSON.stringify(obj)) 

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

如果你的罰款與使用功能,無需在庫看,這是隻有幾個字節:

function find(o, v) { 
    for(var i in o) { 
     if (o[i] === v) return true; 
    } 
} 

find(obj, val2); 
+0

這不會隱藏RegExp中的一些循環嗎? – Almo

+0

不,它測試一個字符串。 – David

+0

@David,正則表達式有一個循環來掃描字符串。 AND,JSON.stringify遍歷對象來構建字符串。這有多個循環。 – jfriend00

1

這工作與jQuery:

$.grep($.map(obj, function(v,k){return v}), function(el){return el == val2}) 

你可以把它包起來,像這樣:

function hasVal(o, v) { 
    $.grep($.map(o, function(v,k){return v}), function(el){return el == v}).length > 0 
} 
1

如果你確定使用外部庫,Underscore.js相當簡潔:

_.contains(_.values(obj), "val2"); 
// true 

這是下劃線的values方法:

返回物體的所有值ct的屬性。

下面是從source code它的實現:

// Retrieve the values of an object's properties. 
    _.values = function(obj) { 
    var values = []; 
    for (var key in obj) if (_.has(obj, key)) values.push(obj[key]); 
    return values; 
    }; 

正如你所看到的,它只是遍歷該對象中的鑰匙,並把它們推到一個數組。所以,不,沒有迭代就不可能做到這一點。