Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 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.
Ответить с цитированием
  #2 (permalink)  
Старый 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));
}
Ответить с цитированием
  #3 (permalink)  
Старый 16.09.2016, 13:51
Аспирант
Отправить личное сообщение для neon_tmn Посмотреть профиль Найти все сообщения от neon_tmn
 
Регистрация: 29.04.2010
Сообщений: 51

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

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

Сообщение от Manyasha Посмотреть сообщение
мы же подаем в функцию obj.num, а это массив! C объектом и не сработало бы.
Понял. Спасибо большое. Поставил плюсик к карме.
Ответить с цитированием
  #6 (permalink)  
Старый 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";
  }
}

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

Все из-за собственной невнимательности. Вот так работает return filt[0][field]; и в вызове функции нужно наименование свойства (или ключа, раз массив) писать в кавычках.
Ответить с цитированием
  #8 (permalink)  
Старый 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);


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

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

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

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как удалить объект прототипа по значению свойства? A1x1On2015 Общие вопросы Javascript 7 30.07.2015 21:51
Обращение к объекту. 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