Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 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 ))
Ответить с цитированием
  #2 (permalink)  
Старый 19.09.2015, 07:51
Профессор
Отправить личное сообщение для caetus Посмотреть профиль Найти все сообщения от caetus
 
Регистрация: 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)
Ответить с цитированием
  #3 (permalink)  
Старый 19.09.2015, 09:47
Кандидат Javascript-наук
Отправить личное сообщение для sortarray Посмотреть профиль Найти все сообщения от sortarray
 
Регистрация: 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}
Ответить с цитированием
  #4 (permalink)  
Старый 19.09.2015, 12:16
Кандидат Javascript-наук
Отправить личное сообщение для фонарик Посмотреть профиль Найти все сообщения от фонарик
 
Регистрация: 23.02.2013
Сообщений: 127

Ребята, спасибо вам большое за помощь, у самого все равно так и не получилось.

Сообщение от caetus Посмотреть сообщение
зачем оно тебе ???
На основе объекта будет строиться список с именем и значением, а сортировка нужна специфическая
Ответить с цитированием
  #5 (permalink)  
Старый 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
Ответить с цитированием
  #6 (permalink)  
Старый 19.09.2015, 15:50
Кандидат Javascript-наук
Отправить личное сообщение для sortarray Посмотреть профиль Найти все сообщения от sortarray
 
Регистрация: 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}

Ведь в твоем исходном сообщении ты говорил, что надо отсортировать, об изменении исходного объекта речи не было
Ответить с цитированием
  #7 (permalink)  
Старый 19.09.2015, 17:11
Кандидат Javascript-наук
Отправить личное сообщение для фонарик Посмотреть профиль Найти все сообщения от фонарик
 
Регистрация: 23.02.2013
Сообщений: 127

sortarray,
я думал сортировка вдогонку объект перестроит, а оказалось фигушки )) Спасибо вам еще раз.
Ответить с цитированием
  #8 (permalink)  
Старый 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?
Ответить с цитированием
  #9 (permalink)  
Старый 19.09.2015, 18:07
Кандидат Javascript-наук
Отправить личное сообщение для sortarray Посмотреть профиль Найти все сообщения от sortarray
 
Регистрация: 19.09.2015
Сообщений: 117

фонарик,
Прости, мне некогда сейчас, отвечу на днях
Ответить с цитированием
  #10 (permalink)  
Старый 19.09.2015, 19:11
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,070

фонарик,
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.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перебрать значения свойств объекта. Александр222 Общие вопросы Javascript 2 25.04.2014 17:27
динамическое обновление свойств объекта в цикле grego Общие вопросы Javascript 3 04.12.2013 23:29
Выдать список всех свойств указанного при вводе объекта указанного фрейма flasher167 Общие вопросы Javascript 11 05.04.2013 08:14
получение значений свойств объекта bear9 Общие вопросы Javascript 3 01.12.2011 23:32
Не работает перебор свойств объекта BANick Общие вопросы Javascript 1 16.09.2008 22:46