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