功能,以数字数组元素输出“不确定”
我想在一个数组数点的每个项目,像这样:功能,以数字数组元素输出“不确定”
["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"]
为什么?我应该如何实现这一点,为什么我的代码不工作?
我想你想是这样的:
for(var i=0, len = this.length; i<len; i++){
tempNum[i] = (i + 1) + ". " + tempNum[i];
}
你使用tempNum
当你不应该在你的等式的右边。你得到“未定义”的原因是因为在你当前的方程中的某个时刻,你会得到一个超出数组长度的索引。
你试过这个吗?我会是一个字符串,所以你得到'0'+ 1(变成01),'1'+ 1(变成11),'2'+ 1(变成21)。所以这不会解决问题。你需要先输入它,先输入 – 2012-03-27 20:35:30
否,你不会。 '我'将成为一个数字,1是一个数字。当您连接到句点时,它会转换为字符串。这就是为什么我把它包装在parens :)工作小提琴:http://jsfiddle.net/edelman/gh8EN/ – Jason 2012-03-27 20:36:50
你的代码工作:)) – 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整洁的技巧,但'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;
}
你的第一句话是不正确的。 '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());
的ES5方式:
Array.prototype.number = function() {
return this.map(function (value, i) {
return (i + 1) + '. ' + value;
});
};
现场演示:http://jsfiddle.net/XSYTK/1/
你”需要为IE8填充.map()。
ha yeah ES5是未来! – Jason 2012-03-27 20:41:31
此网站是为了工作代码的审查。 “我该如何做X”或“为什么Y不能工作”等问题属于SO,我正在迁移这个问题。 – sepp2k 2012-03-27 20:26:07