Функция для нумерации элементов массива выводит "undefined" - PullRequest
2 голосов
/ 28 марта 2012

Я хочу пронумеровать каждый элемент в массиве следующим образом:

["hello", "hi", "hey"].number()
 > ["1. hello", "2. hi", "3. hey"]

Вот мой код:

Array.prototype.number = function () {
    var tempNum = this;
    for (i in this) {
        tempNum[i] = tempNum[(i + 1)] + ". " + tempNum[i]
    }
    return tempNum;
}

Но это вывод:

["hello", "hi", "hey"].number()
 > ["undefined. hello", "undefined. hi", "undefined. hey"]

Почему? Как мне это реализовать и почему мой код не работает?

Ответы [ 6 ]

5 голосов
/ 28 марта 2012

Способ ES5:

Array.prototype.number = function () {
    return this.map( function ( value, i ) {
        return ( i + 1 ) + '. ' + value;
    });
};

Живая демоверсия: http://jsfiddle.net/XSYTK/1/

Для IE8 вам понадобится shim .map ().

5 голосов
/ 28 марта 2012

Я думаю, что вы хотите что-то вроде этого:

for(var i=0, len = this.length; i<len; i++){
    tempNum[i] = (i + 1) + ". " + tempNum[i];
}

вы используете tempNum, когда вы не должны быть в правой части вашего уравнения.Причина, по которой вы получаете «неопределенный», заключается в том, что в какой-то момент текущего уравнения вы получаете индекс, выходящий за пределы длины вашего массива.

3 голосов
/ 28 марта 2012

Внутри цикла for вы делаете:

tempNum[i] = tempNum[(i + 1)] + ". " + tempNum[i]

Если вы просто хотите добавить цифры перед каждым значением, почему вы получаете tempNum[(i + 1)]?

Это должно выглядеть так:

Array.prototype.number = function () {
    var tempNum = this;
    for (var i in this) {
        tempNum[i] = (parseInt(i,10) + 1) + ". " + tempNum[i];
    }
    return tempNum;
}

Обратите внимание на parseInt(i,10)+1. Это добавляет единицу к индексу (после преобразования его в int), а затем добавляет его к строке.

2 голосов
/ 28 марта 2012

tempNum[(i + 1)] - это не то, что вы хотите сделать, вам нужно что-то вроде (i + 1).Это также не работает, потому что ключи всегда являются строками.Чтобы набрать их в число с плавающей точкой, вы можете использовать (parseFloat(i) + 1) или, что лучше, (~~(i) + 1).Общий код становится:

Array.prototype.number = function () {
  var tempNum = this;
  for (i in this) {
    tempNum[i] = (~~(i) + 1) + ". " + tempNum[i]
  }
  return tempNum;
};

console.log(["hello", "hi", "hey"].number());
  // > ["1. hello", "2. hi", "3. hey"] 
1 голос
/ 28 марта 2012

Я бы не пытался изменять сами значения массива при вызове функции number(), потому что если вы снова вызовете функцию для того же массива, нумерация удваивается. Вместо этого лучше создайте новый массив и верните его так:

Array.prototype.number = function () {
    var ret=[];
    var len=this.length;

    for(var i=0;i<len;i++){
        ret.push((i+1)+'. '+this[i]);
    }
    return ret;

}

console.log(["hello", "hi", "hey"].number());

Демо: http://jsfiddle.net/LcHsY/

0 голосов
/ 28 марта 2012

Проблема с вашим текущим решением состоит в том, что в каждой итерации я храню значение элемента вместо индекса.

Итак, когда вы делаете такие вещи, как

tempNum[(i + 1)]

Вы пытаетесь добавить «привет» и 1, и это дает неопределенный результат.

Итак, чтобы ваш код работал, вы можете изменить его следующим образом:

Array.prototype.number = function () {
  var tempNum = this;
  for (var i = 0; i < tempNum.length; ++i) {
    tempNum[i] = (i + 1) + ". " + tempNum[i]
  }
  return tempNum;
}
...