Просмотр полной версии : Своя сортировка...
this.wampa
10.05.2006, 09:24
Подскажите, как при помощи sort или sortOn, сортировать массив по своим правилам, т.е. я хочу чтобы порядок был таким: l, m, h (не по очереди в алфавите). Например:
Несортированный массив: med, low, med, high, low, low, high
А нужно получить: low, low, low, med, med, high, high
sortRules = function (a, b) {
if (objRules[a]>objRules[b]) {
return 1;
} else if (objRules[a]>objRules[b]) {
return -1;
}
};
objRules = {low:0, med:1, high:2};
arrayStart = ["med", "low", "med", "high", "low", "low", "high"];
arrayStart.sort(sortRules);
trace(arrayStart);
this.wampa
10.05.2006, 13:44
Спасибо iNils!!! То что надо! Я долго парилась над этой задачей... Ты просто чудо!
this.wampa
10.05.2006, 17:58
Рано радовалась...
А как мне еще сделать это для sortOn. т.е. для такого массива:
dataArray.push({id:"1", name:"med"});
dataArray.push({id:"2", name:"med"});
dataArray.push({id:"3", name:"high"});
dataArray.push({id:"4", name:"low"});
dataArray.push({id:"5", name:"med"});
dataArray.push({id:"6", name:"high"});
dataArray.push({id:"7", name:"low"});
Array.sortOn(); (http://novemberain.com/livedocs/Help/ActionScriptLangRef/00001201.html#3989254)
this.wampa
10.05.2006, 18:17
Array.sortOn(); (http://novemberain.com/livedocs/Help/ActionScriptLangRef/00001201.html#3989254)
Спасибо, в хелп я умею обращаться. Но в методе sortOn нет compareFunction.
dataArray = [];
dataArray.push ({id:"1", name:"med"});
dataArray.push ({id:"2", name:"med"});
dataArray.push ({id:"3", name:"high"});
dataArray.push ({id:"4", name:"low"});
dataArray.push ({id:"5", name:"med"});
dataArray.push ({id:"6", name:"high"});
dataArray.push ({id:"7", name:"low"});
sortRules = function (a, b) {
if (objRules[a.name] > objRules[b.name]) {
return 1;
} else if (objRules[a.name] > objRules[b.name]) {
return -1;
}
};
objRules = {low:0, med:1, high:2};
dataArray.sort (sortRules);
for (var i=0; i< dataArray.length; i++) {
trace (dataArray[i].id + " " + dataArray[i].name);
}
this.wampa
10.05.2006, 19:23
Спасибо iNils, твой код чудно работает, но я его впихнула в класс, и он перестал работать:
class as.sortTest {
private var dataArray:Array = new Array();
private var objRules:Object = new Object();
function sortTest() {
objRules = {low:0, med:1, high:2};
dataArray.push ({id:"1", name:"med"});
dataArray.push ({id:"2", name:"med"});
dataArray.push ({id:"3", name:"high"});
dataArray.push ({id:"4", name:"low"});
dataArray.push ({id:"5", name:"med"});
dataArray.push ({id:"6", name:"high"});
dataArray.push ({id:"7", name:"low"});
dataArray.sort (sortRules);
for (var i=0; i< dataArray.length; i++) {
trace (dataArray[i].id + " " + dataArray[i].name);
}
}
private function sortRules(a, b) {
if (objRules[a.name] > objRules[b.name]) {
return 1;
} else if (objRules[a.name] > objRules[b.name]) {
return -1;
}
}
}
С классами это к Nirth :)
1) Классы надо именовать с большой буквы(ошибка не из за этого, но стандарты надо соблюдать)
2)
private var objRules:Object = new Object();
замени на
private var objRules = {low:0, med:1, high:2};
основательно сносим первую строчку из конструктора
Если все еще не работает, скажи какие ошибки выдает, что трейситься и покажи код конструктора класса.
PS Не юзайте вы классы если не понимаете, зачем они нужны =)
PPS При объявлении переменной значение ей можно передавать литералом
private var __str:String = "some string";
private var __array:Array = ["some","array"];
private var __obj:Object = {first:"Some",second:"Object"};
Но пользовать конструктором нельзя
private var __str:String = new String(); //выдаст ошибку
this.wampa
10.05.2006, 20:18
1) Классы надо именовать с большой буквы(ошибка не из за этого, но стандарты надо соблюдать)
2)
private var objRules:Object = new Object();
замени на
private var objRules = {low:0, med:1, high:2};
основательно сносим первую строчку из конструктора
Заменила. Теперь выглядит все так:
class as.sortTest {
private var dataArray:Array = new Array();
private var objRules:Object = {low:0, med:1, high:2};
public function sortTest() {
dataArray.push ({id:"1", name:"med"});
dataArray.push ({id:"2", name:"med"});
dataArray.push ({id:"3", name:"high"});
dataArray.push ({id:"4", name:"low"});
dataArray.push ({id:"5", name:"med"});
dataArray.push ({id:"6", name:"high"});
dataArray.push ({id:"7", name:"low"});
dataArray.sort (sortRules);
for (var i=0; i< dataArray.length; i++) {
trace (dataArray[i].id + " " + dataArray[i].name);
}
}
private function sortRules(a, b) {
if (objRules[a.name] > objRules[b.name]) {
return 1;
} else if (objRules[a.name] > objRules[b.name]) {
return -1;
}
}
}
Если все еще не работает, скажи какие ошибки выдает, что трейситься и покажи код конструктора класса.
Ошибок не выдает, просто не происходит сортировка по выбранному параметру. Трейсит элементы массива в первоначальном порядке. Вызываю класс так:
var MySort:as.sortTest = new as.sortTest();
PS Не юзайте вы классы если не понимаете, зачем они нужны =)
Ну не настолько все запущенно, да и начинать надо с чего-то...
Я же написал в PPS что нельзя так делать
private var dataArray:Array = new Array();
делать надо так
private var dataArray:Array
в конструкторе пишем
dataArray=new Array();
Стандартная ошибка, не та область видимости.
В слейдующий раз будьте добры протрейсить все переменные, я не всегда такой добрый, чтобы сохранять в папках классы и тестировать.
class ru.flasher.helping.wampa.SortArray {
private var dataArray:Array;
private var objRules:Object = {low:0, med:1, high:2};
public function SortArray() {
dataArray = new Array();
dataArray.push({id:"1", name:"med"});
dataArray.push({id:"2", name:"med"});
dataArray.push({id:"3", name:"high"});
dataArray.push({id:"4", name:"low"});
dataArray.push({id:"5", name:"med"});
dataArray.push({id:"6", name:"high"});
dataArray.push({id:"7", name:"low"});
dataArray.sort(mx.utils.Delegate.create(this,sortRules));
for (var i = 0; i<dataArray.length; i++) {
trace(dataArray[i].id+" "+dataArray[i].name);
}
}
private function sortRules(a:Number, b:Number):Number {
trace(this.objRules.low);
if (objRules[a.name]>objRules[b.name]) {
return 1;
} else if (objRules[a.name]>objRules[b.name]) {
return -1;
}
}
}
я изменил пакет и название класса, с вас изменить обратно.
Бармалей
10.05.2006, 20:41
iNils, compareFunction должна возвращать еще 0 если оба элемента равны:
sortRules = function (a, b) {
if (objRules[a]>objRules[b]) {
return 1;
} else if (objRules[a]>objRules[b]) {
return -1;
}else{
return 0;
}
};
this.wampa
10.05.2006, 20:50
Nirth, спасибо за потраченное время на меня. Все супер-пупер работает, только я вместо Number, Object поставила:
private function sortRules(a:Object, b:Object):Number { ...
моя ошибка я уже в посте добавил. извинтиляюсь
iNils, compareFunction должна возвращать еще 0 если оба элемента равны:
sortRules = function (a, b) {
if (objRules[a]>objRules[b]) {
return 1;
} else if (objRules[a]>objRules[b]) {
return -1;
}else{
return 0;
}
};
В принципе да, но проблемы в том, что "low" поменяется с другим "low" местами я не вижу. Во втором случаи разница конечно будет, так id будут прыгать, но сортировка по id при равных name не указывалась.
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.