2012-03-14 111 views
6

我明白這有點不正統。如何通過使用其值來獲取密鑰名稱(在哈希中)?

可以說我有這個散列。

someHash = { 
    'item1' => '5', 
    'item2' => '7', 
    'item3' => '45', 
    'item4' => '09' 
} 

使用本機的JS,或原型或jQuery的 - 有這將使我通過只具有值獲得「鍵名」的方法?

我不想要所有的鑰匙,只是一個匹配我的價值的鑰匙。 Sorta像一張地圖反向?

我得到一個返回從數據庫,我得到一個「價值」,我必須匹配該值與前端一些js散列。

因此,該應用程序遞給我「45」...有沒有辦法使用JS(原型或jQuery)然後獲得密鑰「item3」?

+2

你必須遍歷每一個鍵/值對和回報第一個包含你的價值的關鍵。 – Blender 2012-03-14 21:12:26

+0

哈希不以那種方式工作。他們提供有效查找獲取價值的關鍵。反過來,需要迭代(可能)每一個鍵直到找到匹配的值。只是扭轉你的關鍵和價值的定義。 – 2012-03-14 21:13:17

+0

對於普通的數組,你可以使用'.indexOf',但是你正在討論循環對象元素。 – Brad 2012-03-14 21:14:07

回答

4

爲了獲得哪些映射到給定值,您將需要搜索對象屬性。例如

function getKeysForValue(obj, value) { 
    var all = []; 
    for (var name in obj) { 
    if (Object.hasOwnProperty(name) && obj[name] === value) { 
     all.push(name); 
    } 
    } 
    return all; 
} 
+0

如果該值是一個數組會怎樣?像{a:['b','c','d']} – Jazmin 2014-10-23 06:41:50

2

沒有直接的方法,但你可以嘗試這樣的事情。

var key; 
$.each(someHash, function(key, val){ 
    if(val == 'valToCompare'){ 
     key = key; 
     return false; 
    } 
}); 
+0

'break'不起作用,因爲您沒有實際的循環。你需要'返回false'。 – pimvdb 2012-03-14 21:13:52

+0

'break'這裏沒有意義 – kirilloid 2012-03-14 21:14:06

+0

更正了,謝謝。 – ShankarSangoli 2012-03-14 21:14:45

2

沒有獨特性,你可以得到第一:

var hash = {item1: 0, item2: 1}, 
    value = 1, 
    key; 
for(var i in hash) 
{ 
    if (hash.hasOwnProperty(i) && hash[i] === value) { 
     key = i; 
     break; 
    } 
} 
key; // item2 

hasOwnProperty確保哈希有沒有財產的原型。

break找到密鑰後停止循環。

2

我不知道本地的答案,但你可以寫你自己:

var someHash = { 
    'item1' : '5', 
    'item2' : '7', 
    'item3' : '45', 
    'item4' : '09' 
}; 

function getKeyByValue(hash, value) { 
    var key; 
    for(key in hash) { 
    if (hash[key] == value) return key; 
    } 
} 

alert(getKeyByValue(someHash, '7')); 
0

也許array_flip可以幫助你。這將創建一個新的數組,其中鍵是值,反之亦然。然後,只需在該新數組中查找密鑰,並且結果值就是您要查找的原始數組中的密鑰。

0

循環通過對象。

function findInObj(obj, needle) 
    for(var x in obj){ 
     if(obj.x==needle) return x; 
    } 
    return false; 
} 
+0

哇。在這個網站上的答案來得很快。 – whiteatom 2012-03-14 21:15:22

+2

'obj.x'應該是'obj [x]' – 2012-03-14 21:17:06

0

由於對象不止一個屬性可以有相同的值, 你可以返回匹配值的屬性名稱的數組。

var someHash={ 
    'item1':'5', 
    'item2':'7', 
    'item3':'45', 
    'item4':'09', 
    'item5':'7' 
} 
function hasAny(what){ 
    var names= []; 
    for(var p in this){ 
     if(this[p]=== what) names.push(p); 
    } 
    return names; 
} 

hasAny.call(someHash,'7');

/*返回值:(陣列) ITEM2,ITEM5 */

4

使用underscore.js:

_.invert(someHash)[value] 
相關問題