JavaScript - 将索引数组元素乘以2,奇数索引为3

时间:2014-10-24 16:57:50

标签: javascript arrays

我一直在尝试编写代码,将数组的索引元素乘以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,所以我不明白为什么我收到了我做的输出。

任何帮助将不胜感激。

3 个答案:

答案 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)

基本上,您想返回一个修改后的数组,如果初始数组的元素是:

  • 在偶数位置,然后将元素乘以2。
  • 在奇数位置,然后将元素乘以3。

您可以将maparrow functionsconditional (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]