数组元素的函数输出“未定义”

时间:2012-03-27 20:19:40

标签: javascript prototype

我想对数组中的每个项目进行编号,如下所示:

["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 个答案:

答案 0 :(得分:5)

我想你想要这样的东西:

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

当你不应该在等式的右边时,你正在使用tempNum。你得到“未定义”的原因是因为在你当前的等式中你得到的索引超出了数组的长度。

答案 1 :(得分:5)

ES5方式:

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

现场演示: http://jsfiddle.net/XSYTK/1/

你需要为IE8填充.map()。

答案 2 :(得分:3)

在你的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之后),然后将其添加到字符串中。

答案 3 :(得分:2)

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"] 

答案 4 :(得分:1)

在调用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/

答案 5 :(得分:0)

当前解决方案的问题在于,在每次迭代中,我都保存元素的值,而不是索引。

所以,当你做

之类的事情时
tempNum[(i + 1)]

你试图添加“hello”和1,这会给出一个未定义的结果。

因此,为了使代码正常工作,您可以按如下方式更改代码:

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