2012-03-14 87 views
6

Tôi hiểu điều này là một chút không chính thống.Làm cách nào để có được tên khóa (bằng băm) bằng cách sử dụng giá trị của nó?

Cho phép nói rằng tôi có băm này.

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

Sử dụng js gốc hoặc nguyên mẫu hoặc Jquery - có phương pháp nào cho phép tôi nhận "tên khóa" chỉ bằng cách có giá trị không?

Tôi không muốn tất cả khóa, chỉ là khóa khớp với giá trị của tôi. Sắp xếp một bản đồ giống như một bản đồ ngược lại?

Tôi đang nhận được lợi tức từ db mà tôi nhận được "giá trị" và tôi phải khớp với giá trị đó với một số băm js ở giao diện người dùng.

Vì vậy, ứng dụng đưa cho tôi "45" ... Có cách nào để sử dụng js (prototype hoặc jquery) để nhận khóa "item3" không?

+2

Bạn sẽ phải lặp qua tất cả các cặp khoá/giá trị duy nhất và trở lại khóa đầu tiên chứa giá trị của bạn. – Blender

+0

Hashes không hoạt động theo cách đó. Họ cung cấp tra cứu hiệu quả của chìa khóa để có được giá trị.Cách khác xung quanh yêu cầu lặp lại (có thể) mỗi khóa duy nhất cho đến khi bạn tìm thấy giá trị khớp. Chỉ cần đảo ngược định nghĩa của bạn về khóa và giá trị. –

+0

Đối với các mảng thông thường, bạn có thể sử dụng '.indexOf', nhưng bạn đang nói về việc lặp qua các phần tử đối tượng. – Brad

Trả lời

4

Để nhận các phím ánh xạ tới một giá trị nhất định bạn sẽ cần để tìm kiếm thuộc tính đối tượng. Ví dụ

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

Điều gì xảy ra nếu giá trị là một mảng? như {a: ['b', 'c', 'd']} – Jazmin

2

Không có phương pháp trực tiếp nhưng bạn có thể thử một cái gì đó như thế này.

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

'ngắt' không hoạt động vì bạn không có vòng lặp thực. Bạn cần 'return false'. – pimvdb

+0

'break' không có ý nghĩa ở đây – kirilloid

+0

Khắc phục điều đó, cảm ơn. – ShankarSangoli

2

Nếu không có tính độc đáo mà bạn có thể nhận được là người đầu tiên:

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 đảm bảo rằng băm có tài sản không phải là một nguyên mẫu.

break dừng vòng lặp khi tìm thấy khóa.

2

Tôi không biết một câu trả lời tự nhiên, nhưng bạn có thể viết riêng của bạn:

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

lẽ array_flip có thể giúp bạn. Điều này tạo ra một mảng mới trong đó các khóa là các giá trị và ngược lại. Sau đó, chỉ cần tìm khóa trong mảng mới đó và giá trị kết quả là khóa trong mảng ban đầu mà bạn đang tìm kiếm.

0

Lặp qua đối tượng.

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

Chà. các câu trả lời đến nhanh trên trang web này. – whiteatom

+2

'obj.x' phải là' obj [x] ' –

0

Kể từ khi nhiều hơn một tài sản trong một đối tượng có thể có cùng giá trị, bạn có thể trả về một mảng các tên thuộc tính phù hợp với các giá trị.

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');

/* giá trị trả về: (Array) ITEM2, item5 */

4

Sử dụng underscore.js:

_.invert(someHash)[value]