Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Помогите с переопределением массива (https://javascript.ru/forum/misc/46520-pomogite-s-pereopredeleniem-massiva.html)

NuclleaR 13.04.2014 16:51

Помогите с переопределением массива
 
Доброго времени суток, уважаемыке знатоки! Дали задание переопределить метод 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;
};

Octane 13.04.2014 16:58

this.length = 0;
this.push.apply(this, Arr);

NuclleaR 13.04.2014 17:06

Цитата:

Сообщение от Octane (Сообщение 307493)
this.length = 0;
this.push.apply(this, Arr);

Спасибо помогло!!!!!!

NuclleaR 13.04.2014 17:52

В результате получил такой код

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;
};

nerv_ 13.04.2014 19:05

Цитата:

Сообщение от NuclleaR
Дали задание переопределить метод splice

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);

Sweet 13.04.2014 19:28

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;
};

Вроде такая реализация идентична нативной.

nerv_ 13.04.2014 19:33

Цитата:

Сообщение от Sweet
Я бы сделал так

А я бы никак не делал :) Где сказано, что надо написать свою реализацию? Я вижу только переопределить. Т.е. этого достаточно
Array.prototype.splice = function() {
    alert('splice');
};

var arr = [1,2,3];
arr.splice(1, 1);

Sweet 13.04.2014 20:15

Цитата:

Сообщение от nerv_
Где сказано, что надо написать свою реализацию?

Я всё таки думаю, что нужна реализация, а не просто переопределись на что угодно. Иначе почему выбрали именно .splice? Видимо, потому что у этого метода достаточно сложный алгоритм.

NuclleaR 14.04.2014 00:31

nerv_, Sweet,

Заданием было написать метод идентичный нативному slice. я пока учусь и таких тонкостей
var array = [,,];
array.splice(0, 1);
0 in array; // должно быть false, у тебя - true
не знаю

NuclleaR 14.04.2014 00:39

Спасибо за ответы


Часовой пояс GMT +3, время: 04:15.