Перегрузка функции JavaScript не определена - PullRequest
0 голосов
/ 30 мая 2018

У меня есть этот код для пользовательского метода pop ():

Array.prototype.pop = function(index) {
    if (typeof index === "undefined") {
        index = this.length - 1;
    }
    var rtn = this.slice()[index];
    this.remove(this[index]);
    return rtn;
};

Он отлично работает, когда я вводю параметр (например, [1,3,5].pop(1) возвращает 3 и удаляет его).
Однако, когдаЯ использую его без параметров (например, [1,3,5].pop()), он возвращает неопределенное значение и не редактирует массив.Я думаю, что это связано с тем, что перегрузка функции не работает с 0 параметрами.Пожалуйста, вы можете помочь мне найти альтернативы или решение этой проблемы.Спасибо.

Ответы [ 3 ]

0 голосов
/ 30 мая 2018

Вы также можете использовать ForEach для цикла и создания нового массива для заполнения элемента, только если ключ не тот, который указан в ваших аргументах.

Также обратите внимание, что вы можете упростить первую проверкус некоторым значением по умолчанию.Взгляните ( смотреть онлайн ):

Array.prototype.pop = function(key = this.length - 1) {
    let array = [];

    this.forEach(function(element, index) {
      if( index !== key ) {
        array.push(element);
      }
    });

    return array;
};

console.log([1,3,5].pop(1)); // [1, 5]
console.log([1,3,5].pop()); // [1, 3]

Нет необходимости говорить, что переопределение существующих прототипов настоятельно не рекомендуется , вам, вероятно, следует подумать о другом причудливом имени, таком как Array.prototype.eject ...

0 голосов
/ 30 мая 2018

Вам даже не нужно проверять тип индекса, проблема в том, что если индекс не указан, то index не существует, и вы пытаетесь передать фактическое значение не-существующая переменная.Сначала я изменил бы:

if (typeof index === "undefined")

для

if(!index)

Ради ясности.

Затем в блоке if изменение index = this.length - 1; для var index = this.length - 1;

var делает трюк, так как любая переменная доступна вне этой области, если объявлена ​​с вар .

0 голосов
/ 30 мая 2018

Если вы хотите то, что, я думаю, вы хотите (вернуть индексированное значение и удалить его, или использовать последнее значение, если индекса нет), тогда это то, что вы хотите ...

Array.prototype.pop = function(index) {
    if (typeof index === "undefined") {
        index = this.length - 1;
    }
    // remove an array starting at index, with a length of 1,
    // and return the first value
    return this.splice(index, 1)[0];
};

// pop value by index
var arr = [1, 3, 5];

console.log(arr.pop(1));
console.log(arr.toString());

// pop last value
var arr = [1, 3, 5];

console.log(arr.pop());
console.log(arr.toString());

Я бы также рекомендовал включить некоторую проверку смысла, чтобы остановить ошибки, если вы попытаетесь получить значение с недопустимым индексом.

...