我想对数组中的每个项目进行编号,如下所示:
["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 :(得分: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());
答案 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;
}