Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Сортировка свойств объекта по параметру (https://javascript.ru/forum/misc/58388-sortirovka-svojjstv-obekta-po-parametru.html)

фонарик 18.09.2015 21:17

Сортировка свойств объекта по параметру
 
Доброго времени суток. Помогите пожалуйста отсортировать свойства объекта materials исходя из номера индекса имени этого свойства в массиве sort_arr. Нужно чтобы получилось
"Песок": 14, "Цемент" : 5, "Вода" : 8, "Глина" : 10

var materials = {"Глина" : 10, "Цемент" : 5, "Вода" : 8, "Песок" : 14}
var sort_arr =  ["Песок", "Цемент", "Вода"]

alert(JSON.stringify(materials ))

caetus 19.09.2015 07:51

зачем оно тебе ???
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)

sortarray 19.09.2015 09:47

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

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

Цитата:

Сообщение от caetus (Сообщение 389203)
зачем оно тебе ???

На основе объекта будет строиться список с именем и значением, а сортировка нужна специфическая :)

фонарик 19.09.2015 15:34

Цитата:

Сообщение от sortarray (Сообщение 389205)
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 :-?

sortarray 19.09.2015 15:50

фонарик,
потому что это не деструктивная операция, она не меняет исходный объект.
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

sortarray,
я думал сортировка вдогонку объект перестроит, а оказалось фигушки )) Спасибо вам еще раз.

фонарик 19.09.2015 17:55

Цитата:

Сообщение от sortarray (Сообщение 389235)
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? :-?

sortarray 19.09.2015 18:07

фонарик,
Прости, мне некогда сейчас, отвечу на днях:)

рони 19.09.2015 19:11

фонарик,
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}


Часовой пояс GMT +3, время: 14:38.