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

фонарик 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 смотрели?


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