我一直在尝试编写代码,将数组的索引元素乘以2,将奇数索引元素乘以3。
我在变量编号中存储了以下编号,表示数字数组
numbers = [1,7,9,21,32,77];
Even Indexed Numbers - 1,9,32
Odd Indexed Numbers - 7, 21, 77
请记住,数组是零索引,这意味着编号从0开始。在这种情况下,0-Indexed元素实际上是1,而1-Indexed元素是7。
这就是我期望的输出
[2,21,18,63,64,231]
不幸的是,我得到了这个输出
[2,14,17,42,64,154]
以下是我方法的代码
numbers = numbers.map(function(x) {
n = 0;
while (n < numbers.length) {
if (n % 2 == 0) {
return x * 2;
}
else {
return x * 3;
}
n++;
}});
return numbers;
这里我创建了一个while循环,它为变量n的每次迭代执行代码。对于变量n的每个值,我检查n是否为偶数,由代码n%2 == 0使用。虽然0%2 == 0但是1%2 == 0不正确我在while循环结束时递增n,所以我不明白为什么我收到了我做的输出。
任何帮助将不胜感激。
答案 0 :(得分:2)
您通过执行
创建了一个名为n
的全局属性
n = 0;
然后,
while (n < numbers.length) {
if (n % 2 == 0) {
return x * 2;
} else {
return x * 3;
}
}
n++; // Unreachable
你总是马上回来。所以,n++
永远不会增加。因此,n
始终为0,因此所有元素始终乘以2
。
Array.prototype.map
的回调函数,第二个参数是索引本身。因此,使用map
的正确方法是,像这样
numbers.map(function(currentNumber, index) {
if (index % 2 === 0) {
return currentNumber * 2;
} else {
return currentNumber * 3;
}
});
同样可以用三元运算符简洁地写出来,就像这样
numbers.map(function(currentNumber, index) {
return currentNumber * (index % 2 === 0 ? 2 : 3);
});
答案 1 :(得分:1)
为了补充其他答案,OP混淆的根源在于“地图”的工作原理。 map
函数已经已经为每个元素调用 - 但是,OP尝试在其中使用while
循环,这是迭代每个元素的另一种方式。这是双重交互,因此,实质上,如果OP的代码有效,它仍然会修改每个数字n
次!通常,您只需在循环或地图之间进行选择:
使用循环:
var numbers = [1,7,9,21,32,77];
for (var i=0; i<numbers.length; ++i)
numbers[i] = i % 2 === 0 ? numbers[i] * 2 : numbers[i] * 3;
使用地图:
var numbers = [1,7,9,21,32,77];
numbers.map(function(number, index){
return number * (index % 2 === 0 ? 2 : 3);
});
或者,非常简短地说:
[1,7,9,21,32,77].map(function(n,i){ return n * [2,3][i%2]; });
答案 2 :(得分:0)
基本上,您想返回一个修改后的数组,如果初始数组的元素是:
您可以将map与arrow functions和conditional (ternary) operator结合使用以获得这种单线排列
console.log([1,7,9,21,32,77].map((num,ind) => num * (ind % 2 === 0 ? 2 : 3)));
这将输出所需的
[2, 21, 18, 63, 64, 231]