Подтвердить что ты не робот

.push() несколько объектов в массив JavaScript возвращает 'undefined'

Когда я добавляю элементы в массив beats, а затем console.log пользователя, я получаю правильное количество элементов в массиве. Но когда я проверяю .length, я всегда получаю 1. Попытка вызвать индекс всегда даст мне "undefined" так: Tom.beats[1] Я думаю, что мне не хватает чего-то очевидного, но это избивает меня. Я подозреваю, что неправильно использую метод .push, но я не уверен. Любая помощь очень ценится! (используя инструменты Chrome dev)

//The USER

function User(name, role){
    this.beats = [ ]; 

    this.name = name;
    this.role = role;

    // add beats to beats array

    this.addBeats = function(beats){ 
        return this.beats.push(beats);
   };

}

// Three New Instances. Three New Users.

var Mal = new User("Mal", "Rapper");
Mal.addBeats(["love", "cash"]);

var Dan = new User("Dan", "Producer");
Dan.addBeats(["cake", "dirt", "sally-mae"]);

var Tom = new User("Tom", "Producer");
Tom.addBeats(["Fun", "Little", "Samsung", "Turtle", "PC"]);

// Check for position in beats array

console.log(Tom.beats); 
console.log(Mal.beats); 
console.log(Dan.beats); 

console.log(Mal.beats[1]);
console.log(Dan.beats[1]);
console.log(Tom.beats[1]);
4b9b3361

Ответ 1

Array.push(...) принимает несколько аргументов для добавления в список. Если вы поместите их в массив, этот массив массивов "бит" будет добавлен.

Array.concat(...) скорее всего не то, что вы ищете, потому что он генерирует новый массив вместо добавления к существующему.

Вы можете использовать [].push.apply(Array, arg_list) для добавления элементов списка аргументов:

this.addBeats = function(beats) { 
    return [].push.apply(this.beats, beats);
};

Ответ 2

Оператор распространения

В средах, которые поддерживают оператор распространения, вы можете теперь сделать следующее:

this.addBeats = function (beats) {
    return this.beats.push(...beats);
};

Или, если вам нужно больше управления для перезаписи и т.д.

this.addBeats = function(beats) { 
    return this.beats.splice(this.beats.length, null, ...beats);
};

Ответ 3

addBeats() должен concat this.beats с параметром beats.