вторник, 20 октября 2009 г.

Сортировка массивов методом Array.sort


Здравствуйте.
Перед нами задача отсортировать массив строк, в JavaScript существует метод для этого, и звать его Array.sort(),
Сортировка работает с помощью дополнительного, не обязательного параметра, без него метод будет сортировать по возрастанию значения элементов, например
['bb','a','c'].sort() -> ['a','bb','c'].
Посему написал несложную функцию для сортировки строк.

function StrSortByLength(arr,ASC_DESC){
 if(typeof(arr) ==  'string')arr = arr.split(' ');
 var cmp = function(a,b) {
  return a.length < b.length?-1:(a.length > b.length?1:0);   
 }
 return ASC_DESC=='DESC'?arr.sort(cmp).reverse():arr.sort(cmp); 
}
StrSortByLength(['bb','a','c']) // ['a','c','bb']
//или 
StrSortByLength('bb a c') // ['a','c','bb']

В первой строке ф-ции определяем тип передаваемого значения, если это строка то метод split(' ') разбивает ее на массив слов.

Суть функции cmp проста, принимает два аргумента(a,b) и возвращает:

a < b: Отрицательное значение.
a = b: Ноль 
a > b: Положительное значение.

Тесть функцию можно приспособить для своих нужд,
например мне нужно было отсортировать объекты по значению speed:

var _cmp = function (a,b) { 
 if (a.speed < b.speed)  return -1;
 if (a.speed > b.speed)  return 1;
 if (a.speed==b.speed) return 0; 
}; 

Второй параметр моей функции "ASC_DESC" при его отсутствии или значении не равному "DESC" сортировка происходит по возростанию -> ['a','c','bb']
если StrSortByLength('bb a c','DESC') // ["bb", "c", "a"]
Делается это очень просто, так-как массив уже отсортирован, необходимо лишь перевернуть элементы массива, методом reverse().
Надеюсь кому то пригодится. спасибо, Удачи :)

четверг, 8 октября 2009 г.

JavaScript возвращение :)

Здравствуйте, я долго и далеко пропадал, но любовь к JavaScript лишь крепчала :), поэтому решил продолжить писать заметки о JavaScript, и так...

Наверняка, кто-то уже такое написал и обсудил, в библиотеках это сделано точно, и все-же.
Допустим нам нужно создать DOM элемент с параметрами, например <div id='myDiv' style='border:1px solid black; color:red;'> и я очень часто вижу var obj = document.createElem... obj.style.border =... итд, если нужен один элемент то ещё ладно, но когда их несколько это очень много лишних строк кода. Решение очень простое.

function MakeElement(elName,attr){ 
 return SetAttr(document.createElement(elName),attr);
}
function SetAttr(el,attr){
 var a = '';
 for(a in attr){
     if(typeof attr[a] == 'object')SetAttr(el[a],attr[a]);
            else
            el[a] = attr[a];  
 }
  return el;
}
MakeElement('DIV',{'id':'myDiv','style':{'border':
'1px solid black','color':'red'}}); 
Можно оставить одну функцию SetAttr и выглядеть будет не менее симпатично.
function SetAttr(el,attr){
 var a = ''; 
 for(a in attr)
  if(typeof attr[a] == 'object')SetAttr(el[a],attr[a]);
        else el[a] = attr[a];  
}
SetAttr(document.createElement('DIV'),{'id':'myDiv','style':
{'border':'1px solid black','color':'red'}});
А вообще, очень часто банальную задачу, как взять элемент, присвоить стиль, в общем для действие решаемого в 5-10 строк кода подключают библиотеки и пишут 3-8 строк кода, это напоминает сайты на которых кнопки которые меняют фон при наведении сделаны на Flash :), да есть такое, пару дней назад видел.