我正在学习JavaScript并正在解决一个问题,我将一组数字排序为奇数和偶数数组。
为了测试我是否成功,我是警告"最后的数组(并期望看到第一个警报中的偶数,第二个alet中的奇数)。但是,我尝试的一切都没有奏效;我只是收到1
的提醒,然后是空警报。
有谁能告诉我为什么这不起作用?
var numbs = [1, 2, 34, 54, 55, 34, 32, 11, 19, 17, 54, 66, 13];
Sort(numbs);
function Sort(nums) {
var evens = [];
var odds = [];
for (var i = 0; i < arguments.length; i++) {
if (nums[i] % 2) {
evens.push(nums[i]);
} else {
odds.push(nums[i]);
}
}
alert(evens.toString());
alert(odds.toString());
}
答案 0 :(得分:3)
for (var i = 0; i < arguments.length; i++) {
^^^^^^^^^^^^^^^^
这是你的问题。 arguments
是指传递给函数的所有参数的数组(例如arguments
的{{1}}值为function(a, b, c)
)。因此,在您的情况下,[a, b, c]
将为arguments.length
,因为只有一个参数。
事实上,正如您可能已经收集的那样,1
的使用通常是不必要的。通常,如果您想知道它们是否已被提供,您可以检查参数是否为arguments
,并且使用undefined
会大大减慢您的代码速度。您可能几乎不必在代码中使用arguments
。
只需用以下代码替换该行:
arguments
其他一些观察结果:
您的for (var i = 0; i < nums.length; i++) {
条件被翻转 - 它会检测数字是否为奇数,而不是偶数。可以翻转if
和if
语句的正文,也可以使用类似else
的内容。
在函数调用之前使用nums[i] % 2 !== 1
作为局部变量,然后在函数中将其称为numbs
。为什么?这看起来很奇怪而且令人困惑,标准化单个名称将有助于减少将来的错误。 (你也可以在函数外面调用它们,比如说nums
,如果你传递特定的东西,可以在里面调用userAges
。)
您的功能名为nums
,资本为Sort
。这是不寻常的,因为JavaScript的标准命名约定规定变量和函数为S
,即以小写字母开头并用大写字母区分新单词。
缩进似乎很不稳定。这使您的代码更难阅读。尝试使用IDE或某种文本编辑器,它会自动为您缩进代码,使其更易于阅读。
答案 1 :(得分:1)
您需要进行一些修复(并且应该清理代码的格式以提高可读性和可维护性 - 就像我在下面所做的那样):
var numbs = [1,2,34,54,55,34,32,11,19,17,54,66,13];
Sort(numbs);
function Sort(nums) {
var evens = [];
var odds = [];
//alert(arguments.length); // for debugging
for (var i = 0; i < nums.length; i++) { // nums.length per commentary below
//for (var i = 0; i < arguments.length; i++) {
if (nums[i]%2){
odds.push(nums[i]); // odds, not evens per commentary below
//evens.push(nums[i]);
}
else {
evens.push(nums[i]); // evens, not odds per commentary below
//odds.push(nums[i]);
}
}
alert(evens.toString());
alert(odds.toString());
}
arguments.length
是传递给函数的参数个数,而不是在这种情况下作为单个参数传递的数组的长度(即arguments[0].length
);此外,当您可以引用命名参数(即arguments
)时,几乎没有理由使用nums
数组。
此外,您的平均值/赔率逻辑是翻转的。
答案 2 :(得分:1)
来自answer的@Doorknob 冰很好地捕捉了出错的本质,并描述了如何解决问题。
但如果你对一种稍微高级的技术感兴趣,那么这段代码就可以了,而且在我看来它更优雅:
var isEven = function(n) {return n % 2 === 0;};
var isOdd = function(n) {return n % 2 !== 0;};
numbs.filter(isEven); //=> [2, 34, 54, 34, 32, 54, 66]
numbs.filter(isOdd); //=> [1, 55, 11, 19, 17, 13]
换句话说,您在过滤项目时所做的工作已经是数组原型的内置方法。您只需定义要与其一起使用的谓词函数,例如isEven
和isOdd
。
(请注意,isOdd
中的测试不是n % 2 === 1
,因为%
运算符与数学模运算略有不同,如果被除数为负,则返回负值。 )
答案 3 :(得分:0)
你非常接近,你只需做一些改变
第一个需要更改的是将arguments.length更改为nums.length,因为您将数组作为参数传递给它使用它的长度。
需要进行的第二项更改是在if then语句中更改以下内容:
nums[i] % 2
为:
nums[i] % 2 === 0
目前你不是在你的evens数组中存储偶数。
的javascript:
var numbs = [1,2,34,54,55,34,32,11,19,17,54,66,13];
Sort(numbs);
function Sort(nums) {
var evens = [];
var odds = [];
for (var i = 0; i < nums.length; i++) {//<---change number 1
if (nums[i] % 2 === 0){ //<--- change number 2 if the remainder = 0 it is even
evens.push(nums[i]);
}
else {
odds.push(nums[i]);
}
}
alert(evens.toString());
alert(odds.toString());
}
答案 4 :(得分:0)
尝试以下代码,它接受数组numbs
,然后对其进行排序并将奇数插入奇数数组,将偶数插入偶数数组中:
var numbs = [1,2,34,54,55,34,32,11,19,17,54,66,13];
Sort(numbs);
var evens = [];
var odds = [];
function Sort(nums) {
for (var i = 0; i < nums.length; ++i) {
if ((nums[i] % 2) === 0) {
evens.push(nums[i]);
}
if ((nums[i] % 2) == 1) {
odds.push(nums[i]);
}
}
alert(evens);
alert(odds);
}