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}

фонарик 19.09.2015 19:28

рони,
вы настоящий профессор :D Поклон вам до земли. Как же все-таки всё сложно :-?

caetus 19.09.2015 19:47

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

function objSort (obj , arr) {
		var result = {};
	        arr.forEach(function(name) {  if(name in obj) result[name] = obj[name];});
		
		for(var i in obj) 	result[i] = obj[i];
		
		return result;
}



var materials = objSort(materials, sort_arr)

alert(JSON.stringify(materials))

рони 19.09.2015 20:06

caetus,
:write:
arr.forEach(function(name) {name in obj && (result[name] = obj[name])});

caetus 19.09.2015 20:14

теперь можно и удалять свойство с obj и красиво смотреться :dance:

name in obj && (result[name] = obj[name]) && delete obj[name];

рони 19.09.2015 20:35

Цитата:

Сообщение от caetus
delete obj[name];

а надо ли менять исходный обьект без особой нужды?

caetus 19.09.2015 20:58

да тут понятно что без delete функция может сортировать объект и создавать новый отсортированный !

с delete функция делает меньше работы и тут стает вопрос когда эта производительность может пригодится !


отдаю предпочтения функции без delete

sortarray 20.09.2015 06:03

Цитата:

Сообщение от фонарик (Сообщение 389258)
А не подскажете, почему если добавить в sort_arr имена которых нет в объекте materials, то команда log после сортировки materials считает что у объекта есть такие свойства со значением undefined? :-?

из-за вот этой строки.
result[name]=object[name]

object[name], если его нет в object вычисляется в undefined

чтобы этого не было, можно сделать вот такой фикс
materials = {"Глина" : 10, "Цемент" : 5, "Вода" : 8, "Песок" : 14}
sort_arr =  ["Красители", "Песок", "Цемент", "Вода", "Примеси"]
   
sort = function(object, pattern){
  var result={}
  pattern.forEach(function(name){
    if(name in object) 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])
      
    }

фонарик 20.09.2015 18:43

Цитата:

Сообщение от sortarray (Сообщение 389307)
object[name], если его нет в object вычисляется в undefined
чтобы этого не было, можно сделать вот такой фикс

Аха, все теперь работает, спасибо вам еще раз :)

Casufi 26.11.2015 19:04

А можно использовать функцию sort

http://jsfiddle.net/Casufi/6mytecbh/4/

рони 26.11.2015 19:08

Цитата:

Сообщение от Casufi
А можно использовать функцию sort

ой а пост 10 смотрели?

Casufi 26.11.2015 19:17

Цитата:

Сообщение от рони (Сообщение 397785)
ой а пост 10 смотрели?

Смотрел, задача стоит отсортировать исходный объект, зачем там .forEach(function(name) и присвоение объекта самого в себя ?

рони 26.11.2015 19:22

Casufi,
нет там
Цитата:

Сообщение от Casufi
присвоение объекта самого в себя ?

есть создание обьекта согласно отсортированным ключам

Casufi 27.11.2015 09:59

Цитата:

Сообщение от рони (Сообщение 397791)
Casufi,
нет там есть создание обьекта согласно отсортированным ключам

Ну так задача стоит отсортировать существующий объект, зачем тогда создавать новый ?

рони 27.11.2015 10:07

Цитата:

Сообщение от Casufi
отсортировать существующий объект

невозможно, да и новый не гарантированно, что будет отсортированным после создания, вы же сортировали массив.

Casufi 27.11.2015 10:12

Цитата:

Сообщение от рони (Сообщение 397820)
невозможно, да и новый не гарантированно, что будет отсортированным после создания, вы же сортировали массив.

Посыпаю голову пеплом, был невнимателен.


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