 
			
				18.09.2015, 21:17
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Кандидат Javascript-наук 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 23.02.2013 
					
					
					
						Сообщений: 127
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	| 
	
	
		
		
			
			 
				Сортировка свойств объекта по параметру
			 
			
		
		
		
		Доброго времени суток. Помогите пожалуйста отсортировать свойства объекта materials исходя из номера индекса имени этого свойства в массиве sort_arr. Нужно чтобы получилось 
"Песок": 14, "Цемент" : 5, "Вода" : 8, "Глина" : 10
 
var materials = {"Глина" : 10, "Цемент" : 5, "Вода" : 8, "Песок" : 14}
var sort_arr =  ["Песок", "Цемент", "Вода"]
alert(JSON.stringify(materials ))
 
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				19.09.2015, 07:51
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Профессор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 23.09.2014 
					
					
					
						Сообщений: 197
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		зачем оно тебе ??? 
var materials = {"Глина" : 10, "Цемент" : 5, "Вода" : 8, "Песок" : 14}
var sort_arr =  ["Песок", "Цемент", "Вода", "Глина"]
function f (obj, arr) {
	var index;
	for(var i = 0; i < arr.length; i++) {
		index = obj[arr[i]];
		delete obj[arr[i]];
		obj[arr[i]] = index;
	}
}
f(materials, sort_arr)
console.log(materials)
 
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				19.09.2015, 09:47
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Кандидат Javascript-наук 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 19.09.2015 
					
					
					
						Сообщений: 117
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
materials = {"Глина" : 10, "Цемент" : 5, "Вода" : 8, "Песок" : 14}
sort_arr =  ["Песок", "Цемент", "Вода"]
sort = function(object, pattern){
  var result={}
  pattern.forEach(function(name){
    result[name]=object[name]
  })
  Object.keys(object).forEach(function(name){if(pattern.indexOf(name) === -1) result[name] = object[name]})
  return result
}
alert(JSON.stringify(sort(materials, sort_arr)))
//>>>> {"Песок":14,"Цемент":5,"Вода":8,"Глина":10}
 
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				19.09.2015, 12:16
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Кандидат Javascript-наук 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 23.02.2013 
					
					
					
						Сообщений: 127
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		Ребята, спасибо вам большое за помощь, у самого все равно так и не получилось. 
	
 
	
		
			Сообщение от caetus
			 
		
	 | 
 
	| 
		зачем оно тебе ???
	 | 
 
	
 
 На основе объекта будет строиться список с именем и значением, а сортировка нужна специфическая    
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				19.09.2015, 15:34
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Кандидат Javascript-наук 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 23.02.2013 
					
					
					
						Сообщений: 127
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	
		
			Сообщение от sortarray
			 
		
	 | 
 
	
		
materials = {"Глина" : 10, "Цемент" : 5, "Вода" : 8, "Песок" : 14}
sort_arr =  ["Песок", "Цемент", "Вода"]
sort = function(object, pattern){
  var result={}
  pattern.forEach(function(name){
    result[name]=object[name]
  })
  Object.keys(object).forEach(function(name){if(pattern.indexOf(name) === -1) result[name] = object[name]})
  return result
}
//alert(JSON.stringify(sort(materials, sort_arr)))
sort(materials, sort_arr)
alert(JSON.stringify(materials))
//>>>> {"Песок":14,"Цемент":5,"Вода":8,"Глина":10}
	 | 
 
	
 
 Возник вопрос, а почему вот так сортировка не происходит? 13 строку я разделил на 2    
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				19.09.2015, 15:50
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Кандидат Javascript-наук 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 19.09.2015 
					
					
					
						Сообщений: 117
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		фонарик, 
 потому что это не деструктивная операция, она не меняет исходный объект.
 
materials = {"Глина" : 10, "Цемент" : 5, "Вода" : 8, "Песок" : 14}
sort_arr =  ["Песок", "Цемент", "Вода"]
 
sort = function(object, pattern){
  var result={}
  pattern.forEach(function(name){
    result[name]=object[name]
  })
  Object.keys(object).forEach(function(name){if(pattern.indexOf(name) === -1) result[name] = object[name]})
  return result
}
 
materials=sort(materials, sort_arr)
alert(JSON.stringify(materials))
//>>>> {"Песок":14,"Цемент":5,"Вода":8,"Глина":10}
Ведь в твоем исходном сообщении ты говорил, что надо отсортировать, об изменении исходного объекта речи не было   
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				19.09.2015, 17:11
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Кандидат Javascript-наук 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 23.02.2013 
					
					
					
						Сообщений: 127
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	| 
	
	
		
		
		
		
		 sortarray, 
 я думал сортировка вдогонку объект перестроит, а оказалось фигушки )) Спасибо вам еще раз. 
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				19.09.2015, 17:55
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Кандидат Javascript-наук 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 23.02.2013 
					
					
					
						Сообщений: 127
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	
		
			Сообщение от sortarray
			 
		
	 | 
 
	
		
materials = {"Глина" : 10, "Цемент" : 5, "Вода" : 8, "Песок" : 14}
sort_arr =  ["Красители", "Песок", "Цемент", "Вода", "Примеси"]
 
sort = function(object, pattern){
  var result={}
  pattern.forEach(function(name){
    result[name]=object[name]
  })
  Object.keys(object).forEach(function(name){if(pattern.indexOf(name) === -1) result[name] = object[name]})
  return result
}
 
materials=sort(materials, sort_arr)
alert(JSON.stringify(materials))
for (n in materials){
	console.log(n+" "+materials[n])
	
	}
//>>>> {"Песок":14,"Цемент":5,"Вода":8,"Глина":10}
	 | 
 
	
 
 А не подскажете, почему если добавить в sort_arr имена которых нет в объекте materials, то команда log после сортировки materials считает что у объекта есть такие свойства со значением undefined?    
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				19.09.2015, 18:07
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Кандидат Javascript-наук 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 19.09.2015 
					
					
					
						Сообщений: 117
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		фонарик, 
 Прости, мне некогда сейчас, отвечу на днях   
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				19.09.2015, 19:11
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 Профессор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 27.05.2010 
					
					
					
						Сообщений: 33,150
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		фонарик,
  
materials = {"Глина" : 10, "Цемент" : 5, "Вода" : 8, "Песок" : 14}
sort_arr =  ["Красители", "Песок", "Цемент", "Вода", "Примеси"]
sort = function(object, pattern){
  var result={};
  Object.keys(object).sort(function(a,b){
  var aa = pattern.indexOf(a), bb = pattern.indexOf(b);
  if ( aa != -1 && bb != -1) return aa - bb ;
  if ( aa == -1 && bb == -1) return a <  b ? 1 : a > b ? -1 : 0;
  if ( aa == -1 && bb != -1) return 1;
  if ( aa != -1 && bb == -1) return -1;
  }).forEach(function(name){
    result[name]=object[name]
  })
  return result
}
materials=sort(materials, sort_arr)
alert(JSON.stringify(materials))
for (n in materials){
	console.log(n+" "+materials[n])
	}
//>>>> {"Песок":14,"Цемент":5,"Вода":8,"Глина":10}
 
		
	
		
		
		
		
		
		
		
						  
				
				Последний раз редактировалось рони, 19.09.2015 в 19:15.
				
				
			
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
 
 |  
  |