Обращение к объекту по значению свойства
Здравствуйте. Возможно такое и не возможно сделать.
Есть объект {num: [ {"id": 1, "name": "Один"}, {"id": 2, "name": "Два"}, {"id": 3, "name": "Три"} ] } Я знаю цифру 2 и хочу получить слово "Два". Как мне, зная цифру "2" обратиться к объекту num так, чтобы получить значение "Два"? То есть, я знаю имя объекта, я знаю одно значение свойства и по нему хочу получить значение второго свойства. Пример привел элементарный, по идее в id может быть не порядковая цифра, а вообще слово мне известное. |
neon_tmn, здравствуйте.
Наверное, как-то проще можно... Как вариант: var obj = {num: [ {"id": 1, "name": "Один"}, {"id": 2, "name": "Два"}, {"id": 3, "name": "Три"} ] } function getName(obj, id){ var filt = obj.filter(function(e){ return e.id === id; }); if (filt.length == 1){ return filt[0].name; }else if(filt.length > 1){ return "id is not unique"; }else{ return "not found"; } } for (var i = 0; i<=3; i++){ alert(getName(obj.num, i)); } |
Надо же.. весь интернет перерыл, вроде как filter работает с массивами и не думал, что к объектам он применим.
Благодарю. |
Цитата:
|
Цитата:
|
Как-то можно динамически задавать наименование return filt[0].name;
? То, есть, например у меня на самом деле много свойств, есть name, есть description, есть image. Сделать бы одну функцию для получения любого из указанных свойств. function getName(obj, fieldname, id){ // добавил fieldname var filt = obj.filter(function(e){ return e.id === id; }); if (filt.length == 1){ return filt[0].name; // Если вместо name поставлю [B]fieldname[/B], то не сработает, пробовал в квадратных скобках еще писать [B][fieldname][/B], тоже не сработало. }else if(filt.length > 1){ return "id is not unique"; }else{ return "not found"; } } } |
Все из-за собственной невнимательности. Вот так работает return filt[0][field]; и в вызове функции нужно наименование свойства (или ключа, раз массив) писать в кавычках.
|
В таких случаях прибегают к избыточности данных, чтобы не мучить браузер.
var num={ 1:{"id": 1, "name": "Один"}, 2:{"id": 2, "name": "Два"}, 3:{"id": 3, "name": "Три"} }, search=2; if(search in num) console.log(num[search].name); Понял? |
Почему избыточность. Потому что нельзя выкидывать id из объекта, несмотря на идентичное значение в качестве ключа. Вот смотри
var num={ 1:{"id": 1, "name": "Один"}, 2:{"id": 2, "name": "Два"}, 3:{"id": 3, "name": "Три"} }, search=2, stdout=function(obj){ console.log('ID='+obj.id + '; Name='+obj.name); }; if(search in num) stdout(num[search]); Если id выкинуть, то придется передавать его отдельно. Даже если ты веришь, что избыток не понадобится - оставь его. Мемори на клиенте как гавна. |
Цитата:
Но по идешникам получать доступ лучше по ключам. А вообще если так дело у тебя пойдет дальше, тебе придется писать SQL для браузера. ))) |
Часовой пояс GMT +3, время: 23:21. |