Имплементируем недостающие возможности Array

 
0
 
JavaScript
ava
Sardar | 21.11.2004, 18:13
Столкнулся с проблемой, в ИЕ5.0 нет некоторых необходимых в обычной жизни методов Array. Ситуация раздражает, решил исправить ситуацию своим кодом. Где то не очень оптимально(splice), но не думаю что в IE6.0 они реализованны лучше ;-) .
/**
* Далее идёт проверка существования метода, если такого нет, то создаем
*/
/**
* Снять верхний элемент не изменяя содержимого массива
*/
if(!Array.prototype.top) Array.prototype.top=function() {
return this.length>0? this[this.length-1]: null;
};
/**
* Добавить новый(е) элемент(ы) в конец массива
*/
if(!Array.prototype.push) Array.prototype.push=function() {
for(var i=0; i<arguments.length; i++) this[this.length]=arguments[i];
return this.length;
};
/**
* Снять и удалить верхний элемент массива
*/
if(!Array.prototype.pop) Array.prototype.pop=function() {
var ret=this.length>0? this[this.length-1]: null;
if(this.length>0) this.length--;
return ret;
};

/**
* Добавить новые и удалить старые элементы массива, очень полезная функция.
* from - Индекс, с которого начинается изменение массива.
* len - Целое число, обозначающее количество удаляемых старых элементов массива.
* Если лен равно 0, никакие элементы не удаляются. В этом случае Вы
* должны специфицировать как минимум один новый элемент.
* element1 ... elementN - Элементы, добавляемые к массиву. Если Вы не специфицировали
* никаких новых элементов, splice только удаляет элементы из массива.
*/
if(!Array.prototype.splice) Array.prototype.splice=function(from, len) {
var left=this.slice(0, from);
var right=this.slice(from+len);
var rem=this.slice(from, from+len);
var add=[]; add.length=arguments.length-2;
for(var i=2; i<arguments.length; i++) add[i-2]=arguments[i];
var ret=left.concat(add, right);
this.length=0; //delete old items;
for(var i=0; i<ret.length; i++) this[i]=ret[i];
return rem;
};
/**
* Снять элемент с начала массива
*/
if(!Array.prototype.shift) Array.prototype.shift=function(){
return this.splice(0, 1);
};
/**
* добавить элемент в начало массива
*/
if(!Array.prototype.unshift) Array.prototype.unshift=function() {
var add=[];
for(var i=0; i<arguments.length; i++) add[i]=arguments[i];
var ret=add.concat(this);
for(var i=0; i<ret.length; i++) this[i]=ret[i];
return this.length;
};
/**
* Получить строку(сорцы) массива, сериализация массива. При евалиировании полученой строки,
* получим наш массив обратно.
*/
if(!Array.prototype.toSource) Array.prototype.toSource=function() {
for(var i=0; i<this.length; i++) this[i]=this[i].toString().replace(/(["'\\])/g, "\\$1").replace(/\n/g,"\\n");
return "[\""+this.join("\", \"")+"\"]";
};


Ну и конечно пара тестов, работа видна под ИЕ5.0, в других браузерах Array не такой кастрированный. Согласно статистике ИЕ5.0 юзает еще добрые 30% глупого населения нашей планеты.
var a=["test", "bla", "hoi", "wow", "Vingrad"];
alert(a); //исходный массив
alert(a.top()); //берем "Vingrad" не изменяя массива
alert(a.pop()); //берем "Vingrad" удалив его из массива
alert(a);
alert(a.shift()); //возьмём "test"
alert(a.unshift("begin")); //добавим в начало массива, ИЕ6.0 отстойно отошёл от
//спецификации не возвратив новое количество элементов, моя функция делает всё как надо;-)
alert(a.push("end")); //добавим в конец массива
alert(a);
//удалим "bla", "hoi", "wow" и вставим на их место новые элементы
alert(a.splice(1, 3, "Privet", "Vsem", "Jeto", "neskol'ko", "novyx", "jelementov"));
alert(a);
alert(a.toSource()); //получим исходник
Kommentare (0)

Kommentare werden nicht hinzugefügt

Registrieren Sie sich oder melden Sie sich an, um schreiben zu können.
Unternehmen des Tages
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Mitwirkende
  Sardar
advanced
Absenden