2015-05-30 3 views
2

Я пытаюсь вырезать некоторые значения из массива, например, я хочу вырезать 1 из его позиции и вернуть массив как (3,5,4,6,2,7), но есть ошибка говорит, что сращивание не является функцией.Функция Javascript и массив

function findMin() { 
    var arr = arguments; 
    arr.splice(1,1); 
    return arr[0]; 
} 
document.getElementById("demo").innerHTML = findMin(1,3,5,4,6,2,7); 

ответ

3

Проблема заключается в arguments isn't an array, but an array-like object.

Обычным решением является использование slice для получения массива из объекта, подобного массиву. И как нормальная цель slice, чтобы получить кусочек из массива, вот решение дает вам копию arguments без первого элемента:

function findMin() { 
    return Array.prototype.slice.call(arguments, 1); 
} 

Примечания

  1. Манипулирование arguments, даже с использованием slice оказывает влияние на всю функцию, в которой вы это делаете. Избегайте его, когда сможете.

  2. Благодаря ES6 (следующая итерация стандарта позади JavaScript), we'll be able to use Array.from instead of slice в ближайшем будущем.

4

arguments не является массивом, это массив как. Вы можете получить копию его содержимого в виде массива:

var arr = Array.prototype.slice.call(arguments, 0); 

... а затем вы можете использовать операции массива на нем.

Две другие проблемы с кодом:

  • Индексы, которые вы используете с splice начала в 0, не 1

  • Вы возвращенная (новый) первый элемент, а не массив

Но учтите, что для вашего конкретно задача, вы не знаете чтобы пройти все эти операции, вы можете просто использовать slice; Denys Séguret shows you that.

Вот пример только с помощью slice скопировать arguments, без сочетания с другим кодом, с другими вопросами выше фиксированными, а также:

function findMin() { 
 
    var arr = Array.prototype.slice.call(arguments, 0); 
 
    arr.splice(0, 1); 
 
    return arr; 
 
} 
 
document.getElementById("demo").innerHTML = findMin(1, 3, 5, 4, 6, 2, 7);
<div id="demo"></div>

+0

Существует более простое решение;) –

+0

@ DenysSéguret: Для этой * конкретной * проблемы, да, совершенно верно. :-) Я как бы обратился к аспекту «аргументов». –

Смежные вопросы