2012-03-27 44 views
2

我想在一個數組數點的每個項目,像這樣:功能,以數字數組元素輸出「不確定」

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

回答

5

我想你想是這樣的:

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

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

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

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後)添加一個,然後將其預先添加到該字符串中。

0

與當前解決方案的問題是,在每次迭代中,我保持代替索引的元素的值,。

所以,當你做這樣的事情

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

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

的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