Как я могу получить имя ключа (в хэше), используя его значение? - PullRequest
7 голосов
/ 15 марта 2012

Я понимаю, что это немного неортодоксально.

Допустим, у меня есть этот хэш.

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

Использование нативного js, или прототипа, или Jquery - есть ли метод, который позволитмне получить «имя ключа», просто имея значение?

Мне не нужны все ключи, только тот, который соответствует моему значению.Что-то вроде карты в обратном порядке?

Я получаю возврат из БД, который я получаю "значение", и мне нужно сопоставить это значение с некоторым js-хешем на входе.

Итак, приложение дает мне «45» ... Есть ли способ использовать js (прототип или jquery), чтобы затем получить ключ «item3»?

Ответы [ 8 ]

5 голосов
/ 08 января 2015

Использование underscore.js:

_.invert(someHash)[value]
5 голосов
/ 15 марта 2012

Чтобы получить ключи , которые сопоставляются с заданным значением, вам нужно искать свойства объекта. Например

function getKeysForValue(obj, value) {
  var all = [];
  for (var name in obj) {
    if (Object.hasOwnProperty(name) && obj[name] === value) {
      all.push(name);
    }
  }
  return all;
}
2 голосов
/ 15 марта 2012

Я не знаю собственного ответа, но вы можете написать свой собственный:

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'));
2 голосов
/ 15 марта 2012

Без уникальности вы можете получить первое:

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 голосов
/ 15 марта 2012

Прямого метода не существует, но вы можете попробовать что-то вроде этого.

var key;
$.each(someHash, function(key, val){
    if(val == 'valToCompare'){
        key = key;
        return false;
    }
});
0 голосов
/ 15 марта 2012

Поскольку более чем одно свойство в объекте может иметь одно и то же значение, вы можете вернуть массив имен свойств, соответствующих этому значению.

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 * /

0 голосов
/ 15 марта 2012

Цикл по объекту.

function findInObj(obj, needle)
    for(var x in obj){
      if(obj.x==needle) return x;
    }
    return false;
}
0 голосов
/ 15 марта 2012

Возможно, array_flip может вам помочь. Это создает новый массив, где ключами являются значения, и наоборот. Затем просто найдите ключ в этом новом массиве, и полученное значение будет ключом в исходном массиве, который вы искали.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...