Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 13.04.2014, 16:51
Аватар для NuclleaR
Интересующийся
Отправить личное сообщение для NuclleaR Посмотреть профиль Найти все сообщения от NuclleaR
 
Регистрация: 15.02.2014
Сообщений: 19

Помогите с переопределением массива
Доброго времени суток, уважаемыке знатоки! Дали задание переопределить метод 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;
};
Ответить с цитированием
  #2 (permalink)  
Старый 13.04.2014, 16:58
Отправить личное сообщение для Octane Посмотреть профиль Найти все сообщения от Octane  
Регистрация: 10.07.2008
Сообщений: 3,873

this.length = 0;
this.push.apply(this, Arr);
Ответить с цитированием
  #3 (permalink)  
Старый 13.04.2014, 17:06
Аватар для NuclleaR
Интересующийся
Отправить личное сообщение для NuclleaR Посмотреть профиль Найти все сообщения от NuclleaR
 
Регистрация: 15.02.2014
Сообщений: 19

Сообщение от Octane Посмотреть сообщение
this.length = 0;
this.push.apply(this, Arr);
Спасибо помогло!!!!!!
Ответить с цитированием
  #4 (permalink)  
Старый 13.04.2014, 17:52
Аватар для NuclleaR
Интересующийся
Отправить личное сообщение для NuclleaR Посмотреть профиль Найти все сообщения от NuclleaR
 
Регистрация: 15.02.2014
Сообщений: 19

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

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

Последний раз редактировалось NuclleaR, 13.04.2014 в 18:03.
Ответить с цитированием
  #5 (permalink)  
Старый 13.04.2014, 19:05
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

Сообщение от 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);
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук

Последний раз редактировалось nerv_, 13.04.2014 в 19:36.
Ответить с цитированием
  #6 (permalink)  
Старый 13.04.2014, 19:28
Профессор
Отправить личное сообщение для Sweet Посмотреть профиль Найти все сообщения от Sweet
 
Регистрация: 16.03.2010
Сообщений: 1,618

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

Вроде такая реализация идентична нативной.
Ответить с цитированием
  #7 (permalink)  
Старый 13.04.2014, 19:33
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

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

var arr = [1,2,3];
arr.splice(1, 1);
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Ответить с цитированием
  #8 (permalink)  
Старый 13.04.2014, 20:15
Профессор
Отправить личное сообщение для Sweet Посмотреть профиль Найти все сообщения от Sweet
 
Регистрация: 16.03.2010
Сообщений: 1,618

Сообщение от nerv_
Где сказано, что надо написать свою реализацию?
Я всё таки думаю, что нужна реализация, а не просто переопределись на что угодно. Иначе почему выбрали именно .splice? Видимо, потому что у этого метода достаточно сложный алгоритм.
Ответить с цитированием
  #9 (permalink)  
Старый 14.04.2014, 00:31
Аватар для NuclleaR
Интересующийся
Отправить личное сообщение для NuclleaR Посмотреть профиль Найти все сообщения от NuclleaR
 
Регистрация: 15.02.2014
Сообщений: 19

nerv_, Sweet,

Заданием было написать метод идентичный нативному slice. я пока учусь и таких тонкостей
var array = [,,];
array.splice(0, 1);
0 in array; // должно быть false, у тебя - true
не знаю
Ответить с цитированием
  #10 (permalink)  
Старый 14.04.2014, 00:39
Аватар для NuclleaR
Интересующийся
Отправить личное сообщение для NuclleaR Посмотреть профиль Найти все сообщения от NuclleaR
 
Регистрация: 15.02.2014
Сообщений: 19

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

Последний раз редактировалось NuclleaR, 14.04.2014 в 00:53.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите с сортировкой массива bolatik Javascript под браузер 4 16.01.2014 14:58
Помогите с перебором массива qaim jQuery 6 30.05.2013 17:06
Помогите разобраться с повторением при генерации массива (Javascript) JsLoveR Javascript под браузер 4 16.12.2009 15:26
Помогите решить задачку---Найти сумму элементов массива uniQ Общие вопросы Javascript 3 02.05.2009 01:20