Javascript.RU

 
 
Опции темы
 
Старый 16.09.2016, 13:20
Аспирант
Отправить личное сообщение для neon_tmn Посмотреть профиль Найти все сообщения от neon_tmn
 
Регистрация: 29.04.2010
Сообщений: 51

Обращение к объекту по значению свойства
Здравствуйте. Возможно такое и не возможно сделать.
Есть объект
{num: [
      {"id": 1, "name": "Один"},
      {"id": 2, "name": "Два"},
      {"id": 3, "name": "Три"}
]
}


Я знаю цифру 2 и хочу получить слово "Два".
Как мне, зная цифру "2" обратиться к объекту num так, чтобы получить значение "Два"?
То есть, я знаю имя объекта, я знаю одно значение свойства и по нему хочу получить значение второго свойства.
Пример привел элементарный, по идее в id может быть не порядковая цифра, а вообще слово мне известное.

Последний раз редактировалось neon_tmn, 16.09.2016 в 13:25.
 
Старый 16.09.2016, 13:38
Профессор
Отправить личное сообщение для Manyasha Посмотреть профиль Найти все сообщения от Manyasha
 
Регистрация: 21.09.2015
Сообщений: 196

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));
}
 
Старый 16.09.2016, 13:51
Аспирант
Отправить личное сообщение для neon_tmn Посмотреть профиль Найти все сообщения от neon_tmn
 
Регистрация: 29.04.2010
Сообщений: 51

Надо же.. весь интернет перерыл, вроде как filter работает с массивами и не думал, что к объектам он применим.
Благодарю.
 
Старый 16.09.2016, 14:01
Профессор
Отправить личное сообщение для Manyasha Посмотреть профиль Найти все сообщения от Manyasha
 
Регистрация: 21.09.2015
Сообщений: 196

Сообщение от neon_tmn Посмотреть сообщение
filter работает с массивами и не думал, что к объектам он применим.
мы же подаем в функцию obj.num, а это массив! C объектом и не сработало бы.
 
Старый 16.09.2016, 14:03
Аспирант
Отправить личное сообщение для neon_tmn Посмотреть профиль Найти все сообщения от neon_tmn
 
Регистрация: 29.04.2010
Сообщений: 51

Сообщение от Manyasha Посмотреть сообщение
мы же подаем в функцию obj.num, а это массив! C объектом и не сработало бы.
Понял. Спасибо большое. Поставил плюсик к карме.
 
Старый 16.09.2016, 14:34
Аспирант
Отправить личное сообщение для neon_tmn Посмотреть профиль Найти все сообщения от neon_tmn
 
Регистрация: 29.04.2010
Сообщений: 51

Как-то можно динамически задавать наименование 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";
  }
}

}
 
Старый 16.09.2016, 15:03
Аспирант
Отправить личное сообщение для neon_tmn Посмотреть профиль Найти все сообщения от neon_tmn
 
Регистрация: 29.04.2010
Сообщений: 51

Все из-за собственной невнимательности. Вот так работает return filt[0][field]; и в вызове функции нужно наименование свойства (или ключа, раз массив) писать в кавычках.
 
Старый 17.09.2016, 18:44
Профессор
Отправить личное сообщение для warren buffet Посмотреть профиль Найти все сообщения от warren buffet
 
Регистрация: 08.07.2016
Сообщений: 1,332

В таких случаях прибегают к избыточности данных, чтобы не мучить браузер.

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


Понял?
 
Старый 17.09.2016, 18:49
Профессор
Отправить личное сообщение для warren buffet Посмотреть профиль Найти все сообщения от warren buffet
 
Регистрация: 08.07.2016
Сообщений: 1,332

Почему избыточность. Потому что нельзя выкидывать 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 выкинуть, то придется передавать его отдельно. Даже если ты веришь, что избыток не понадобится - оставь его. Мемори на клиенте как гавна.
 
Старый 17.09.2016, 18:57
Профессор
Отправить личное сообщение для warren buffet Посмотреть профиль Найти все сообщения от warren buffet
 
Регистрация: 08.07.2016
Сообщений: 1,332

Сообщение от neon_tmn
То, есть, например у меня на самом деле много свойств
Свойства в списках находятся в полях. Так и говорят - найти значение по полю такому-то. Ну да, тогда дописываешь аргумент для имени поля и проверку.

Но по идешникам получать доступ лучше по ключам.

А вообще если так дело у тебя пойдет дальше, тебе придется писать SQL для браузера. )))
 

Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как удалить объект прототипа по значению свойства? A1x1On2015 Общие вопросы Javascript 5 30.07.2015 17:41
Обращение к объекту. SPQR Общие вопросы Javascript 4 15.01.2014 10:42
Как обратиться к значению свойства SA1992 Общие вопросы Javascript 7 17.12.2013 15:36
Как реализовать обращение к объекту, конкретнее см внутри kichSman jQuery 4 15.08.2012 18:06
Обращение к объекту через ссылку boro-da jQuery 4 08.08.2011 15:48


© Илья Кантор, 2007-2021 О проекте - Архив форума - Вверх