功能,以数字数组元素输出“不确定”

问题描述:

我想在一个数组数点的每个项目,像这样:功能,以数字数组元素输出“不确定”

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

为什么?我应该如何实现这一点,为什么我的代码不工作?

+0

此网站是为了工作代码的审查。 “我该如何做X”或“为什么Y不能工作”等问题属于SO,我正在迁移这个问题。 – sepp2k 2012-03-27 20:26:07

我想你想是这样的:

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

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

+0

你试过这个吗?我会是一个字符串,所以你得到'0'+ 1(变成01),'1'+ 1(变成11),'2'+ 1(变成21)。所以这不会解决问题。你需要先输入它,先输入 – 2012-03-27 20:35:30

+2

否,你不会。 '我'将成为一个数字,1是一个数字。当您连接到句点时,它会转换为字符串。这就是为什么我把它包装在parens :)工作小提琴:http://jsfiddle.net/edelman/gh8EN/ – Jason 2012-03-27 20:36:50

+1

你的代码工作:)) – 2012-03-27 20:38:12

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

用'〜'运算符+1整洁的技巧,但'parseInt()'更清晰 – seand 2012-03-27 20:52:48

内,您的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后)添加一个,然后将其预先添加到该字符串中。

与当前解决方案的问题是,在每次迭代中,我保持代替索引的元素的值,。

所以,当你做这样的事情

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; 
} 
+2

你的第一句话是不正确的。 'i'包含**键**(**索引**),当做'for(i in x)'时。 – 2012-03-27 20:37:12

我不会尝试修改调用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/

的ES5方式:

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

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

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

+1

ha yeah ES5是未来! – Jason 2012-03-27 20:41:31