Сортировка двумерного массива в JS

Герман

Новичок
Сортировка двумерного массива в JS

Имеется массив вида data=[ {data:0, text:"dsfgds" }, {data:45, text:"dsfgds" }.... ];
нужно отсортировать его по .text
 

dimagolov

Новичок
вообще-то я под двумерные массивы, а не под массив объектов писал в свое время, но должно работать и так.

п.с. сильно не уверен, что встроенный sort шибко быстрый, если затачивать под конкретную структуру быстрее будет, вопрос на сколько и как критична та скорость с твоими наборами данных

PHP:
function Sorter2D () {}
Sorter2D.prototype= {
	aSortFunc : {	"String" : function (a, b, Idx) {
															if (a[Idx] == b[Idx]) return 0;
															return a[Idx] < b[Idx] ? -1 : 1;
														},
								"Number" : function (a, b, Idx) {
															return a[Idx] - b[Idx];
														},
								"Date" : function (a, b, Idx) {
															switch (top.CompareDateTime(a[Idx], b[Idx])) {
																case "Less":
																	return -1;
																case "Greater":
																	return 1;
																default:
																	return 0;
															}
														}
								},
								
	SortUnorderedColumn : function (aArray, SortColumn, SortType) {
		var t= this;
		if (!aArray || aArray.length < 2 || !t.aSortFunc[SortType]) return;
		aArray= aArray.sort(function (a,b) { return t.aSortFunc[SortType](a, b, SortColumn)});
	}
};
oSorter2D= new Sorter2D();
data=[ {data:0, text:"dsfgds" }, {data:45, text:"dsfgds" }.... ];
oSorter2D.SortUnorderedColumn(data, "text", "String");
 

FB3

Новичок
Тут не двумерный массив, тут массив объектов у тебя.
 

Герман

Новичок
Работает Спасибо!!

-~{}~ 05.02.09 22:37:

Eсть еще проблема метод для обработки свойства Date
не работает
"Date" : function (a, b, Idx) {
switch (top.CompareDateTime(a[Idx], b[Idx])) {
case "Less":
return -1;
case "Greater":
return 1;
default:
return 0;
}

top.CompareDateTime -- функции нет пытаюсь
переопределить на

if (a[Idx].GetTime() == b[Idx].GetTime()) return 0;
return a[Idx].GetTime() < b[Idx].GetTime ? -1 : 1;

выдает-a[Idx].GetTime() is not a function

a[Idx].toString() при этом работает
 

-SkyNet-

Новичок
потому что выражение a[Idx].GetTime() подразумевает что прототип конструктора имеет метод GetTime, и данным выражением он вызывается без аргументов


разберите свойства prototype и constructor

если влом - используйте функциональный подход

GetTime=function(obj) {...}

GetTime(a[Idx])
 

dimagolov

Новичок
ой, я и не заметил что у меня там дата сравнивается через CompareDateTime. кроме этого места данная ф-я еще аж в 2-х местах из почти 2-х метров исходинков используется, так что не обратил на нее внимания.

код очень кривой и по-моему дописан до меня, так что чур не быть за кривизну

PHP:
function CompareDateTime(DateTimeOne, DateTimeTwo) {
	if (!DateTimeOne && !DateTimeTwo)
		return "Equal";
	if (!DateTimeOne)
		return "Greater";
	if (!DateTimeTwo)
		return "Less";		
	var aDateAndTimeOne= DateTimeOne.split(' ');
	var aDateAndTimeTwo= DateTimeTwo.split(' ');
	var aDateOne= aDateAndTimeOne[0].split('-');
	var aDateTwo= aDateAndTimeTwo[0].split('-');	
	
	if (aDateOne[1].length == 3)
		aDateOne[1]= GetMonthUsingString (aDateOne[1]);
	if (aDateTwo[1].length == 3)
		aDateTwo[1]= GetMonthUsingString (aDateTwo[1]);	
	for (var i= 0; i < 3; i ++)
	{
		if (parseInt(aDateOne[i], 10) < parseInt(aDateTwo[i], 10))
			return "Less";
		else if (parseInt(aDateOne[i], 10) > parseInt(aDateTwo[i], 10))
			return "Greater";
	}

	if (aDateAndTimeOne.length == 1)
		return "Equal";
		
	var aTimeOne= aDateAndTimeOne[1].split(':');
	var aTimeTwo= aDateAndTimeTwo[1].split(':');	
	
	for (var i= 0; i < 3; i ++)
	{
		if (aTimeOne[i] < aTimeTwo[i])
			return "Less";
		else if (aTimeOne[i] > aTimeTwo[i])
			return "Greater";
	}	
	return "Equal";
}
формат даты - строка типа как дефолтный в MySQL YYYY-MM-DD HH:MM:SS

-~{}~ 11.02.09 08:23:

как оказалось, это еще не все :)
PHP:
	GetMonthUsingString= function(MonthCode) {
		var MonthNames= ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'];
		for (var i= 0; i < this.MonthNames.length; i++)
			if (MonthNames[i] == MonthCode)
				return i;
	}
 
Сверху