Помогите с переопределением массива
Доброго времени суток, уважаемыке знатоки! Дали задание переопределить метод splice :)
функция не дописана, ещё не реализовывал добавление элементов. проблема собственно такого характера: как переопределить исходный массив? this = Arr не прмогает :( Array.prototype.splice = function (start, deleteCount) { var removedArr = []; var Arr = []; for ( var i = start; i <= deleteCount; i++ ) { removedArr.push( this[i] ); } for ( var j = 0; j < start; j++) { Arr.push(this[j]); } for ( var n = deleteCount+1; n < this.length; n++ ) { Arr.push(this[n]) } return removedArr; }; |
this.length = 0; this.push.apply(this, Arr); |
Цитата:
|
В результате получил такой код
Array.prototype.splice = function (start, deleteCount) { var removedArr = []; var Arr = []; if (start < 0){ start = this.length + start; } for ( var i = start; i <= start + deleteCount-1; i++ ) { removedArr.push( this[i] ); } for ( var j = 0; j < start; j++) { Arr.push(this[j]); } for (var a = 2; a <= arguments.length; a++){ if (typeof arguments[a] == 'undefined'){ break; } else { Arr.push(arguments[a]); } } for ( var n = start+deleteCount; n < this.length; n++ ) { Arr.push(this[n]) } this.length = 0; this.push.apply(this, Arr); return removedArr; }; |
Цитата:
Array.prototype.splice = (function(method) { return function() { return method.apply(this, arguments); }; }(Array.prototype.splice)); var arr = [1,2,3]; arr.splice(1, 1); alert(arr); |
NuclleaR, в твоём варианте есть несоответствие нативному методу:
var array = [,,]; array.splice(0, 1); 0 in array; // должно быть false, у тебя - true А используя метод .slice, можно избавиться от циклов и значительно сократить код. Я бы сделал так: Array.prototype.splice = function (start, deleteCount) { if (start < 0) start += this.length; if (start > this.length) start = this.length; var removed = this.slice(start, start + deleteCount); var tail = this.slice.call(arguments, 2).concat(this.slice(start + deleteCount)); this.length = start + tail.length; for(var i = 0; i < tail.length; i++) { if (i in tail) this[start + i] = tail[i]; else delete this[start + i]; } return removed; }; Вроде такая реализация идентична нативной. |
Цитата:
Array.prototype.splice = function() { alert('splice'); }; var arr = [1,2,3]; arr.splice(1, 1); |
Цитата:
|
nerv_, Sweet,
Заданием было написать метод идентичный нативному slice. я пока учусь и таких тонкостей var array = [,,]; array.splice(0, 1); 0 in array; // должно быть false, у тебя - true не знаю |
Спасибо за ответы
|
Часовой пояс GMT +3, время: 04:15. |