 
			
				16.09.2016, 13:20
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Аспирант 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 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
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Профессор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 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
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Аспирант 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 29.04.2010 
					
					
					
						Сообщений: 51
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	| 
	
	
		
		
		
		
		 Надо же.. весь интернет перерыл, вроде как filter работает с массивами и не думал, что к объектам он применим. 
Благодарю. 
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				16.09.2016, 14:01
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Профессор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 21.09.2015 
					
					
					
						Сообщений: 196
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	
		
			Сообщение от neon_tmn
			 
		
	 | 
 
	| 
		filter работает с массивами и не думал, что к объектам он применим.
	 | 
 
	
 
 мы же подаем в функцию obj.num, а это массив! C объектом и не сработало бы.  
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				16.09.2016, 14:03
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Аспирант 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 29.04.2010 
					
					
					
						Сообщений: 51
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	
		
			Сообщение от Manyasha
			 
		
	 | 
 
	| 
		мы же подаем в функцию obj.num, а это массив! C объектом и не сработало бы.
	 | 
 
	
 
 Понял. Спасибо большое. Поставил плюсик к карме.  
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				16.09.2016, 14:34
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Аспирант 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 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
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Аспирант 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 29.04.2010 
					
					
					
						Сообщений: 51
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	| 
	
	
		
		
		
		
		 Все из-за собственной невнимательности. Вот так работает return filt[0][field];  и в вызове функции нужно наименование свойства (или ключа, раз массив) писать в кавычках. 
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				17.09.2016, 18:44
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Профессор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 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
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Профессор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 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
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Профессор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 08.07.2016 
					
					
					
						Сообщений: 1,332
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	| 
		
			Сообщение от neon_tmn
			
		
	 | 
 
	| 
		То, есть, например у меня на самом деле много свойств
	 | 
 
	
 
 Свойства в списках находятся в полях. Так и говорят - найти значение по полю такому-то. Ну да, тогда дописываешь аргумент для имени поля и проверку.
 
Но по идешникам получать доступ лучше по ключам.
 
А вообще если так дело у тебя пойдет дальше, тебе придется писать SQL для браузера. )))  
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
 
 |  
  |