【问题标题】:How do I double every other element in an array?如何将数组中的所有其他元素加倍?
【发布时间】:2015-11-18 16:56:28
【问题描述】:

我需要在程序结束时输出两个数组。

第一个数组是用户输入的内容。第二个数组应该复制第一个数组的元素,并用它的双精度替换所有其他元素。假设用户将“1、2、3、4、5”保存到第一个数组。第二个数组应该有:“1, 4, 3, 8, 5”。

这是我目前所拥有的。

头部标签

function toDouble(modArray)
{
   var modified = new Array();
   for(var i = 1; i < modArray.length; i+=2)
   {
      modified.push(modArray[i] * 2); 
   }
return modified;
}

身体标签

var origArray = new Array();
var modArray = new Array();
while() //ignore the while loop part; it is working fine
{ 
   origArray = parseInt(prompt("Enter a number: ")); 
   document.write(origArray); //output 1
   modArray.push(origArray);
}
var modified = toDouble(modArray); 
document.write(modified); //output 2

我只收到加倍的数字,而不是整个数组。例如,如果我输入“1, 2, 3, 4, 5”,我只会得到“4, 8”作为输出。

我该如何解决这个问题?提前谢谢!

【问题讨论】:

  • 你期望“2、4、6、8、10”中的“1、4、3、8、5”吗?

标签: javascript arrays


【解决方案1】:

**在数组上使用 map **

const double =function(a){
const copy=[...a];//bad practice to mutate directly function parameter
const final=copy.map((cur,i)=> i%2===0?cur:2*cur;//[0/2=0]=cur,,[1/2!=0]=2*curr
return final;
}`
//output [1,4,3,8,5]

【讨论】:

    【解决方案2】:

    您还可以通过数组映射以获得相同的结果。在这里,您使用索引来查看元素是否在每个第二个位置。

    function toDouble(modArray) {
       return modArray.map((e,i) => i % 2 == 0 ? e : 2 * e); 
    }
    

    【讨论】:

      【解决方案3】:
      function toDouble(modArray)
      {
          var modified = new Array();
          for(var i = 1; i < modArray.length; i+=2)
          {
              modified.push(modArray[i-1]);
              modified.push(modArray[i] * 2); 
          }
      
          if(modified.length < modArray.length)
              modified.push(modArray[modArray.length - 1]);
          return modified;
      }
      

      【讨论】:

      • 试试这个:[1,2,3]。结果将是[1, 4]
      • 返回前检查数组是否长度相同,如果不推送最后一个元素...
      【解决方案4】:

      这样做:-

      function toDouble(modArray) {
          for (var i = 1; i < modArray.length; i+=2) {
              modArray[i] *= 2;
          }
          return modArray;
      }
      

      【讨论】:

        【解决方案5】:

        正如已经解释的那样,问题是当您创建新数组时,您只考虑原始数组中的替代元素

        使用Array.map()的另一种解决方案

        function toDouble(modArray) {
          return modArray.map(function(val, i) {
            return i % 2 == 0 ? val : val * 2;
          })
        }
        
        
        var modArray = new Array(),
          origArray;
        while (modArray.length < 5) //ignore the while loop part; it is working fine
        {
          origArray = parseInt(prompt("Enter a number: "));
          modArray.push(origArray);
        }
        
        snippet.log('modArray: ' + modArray)
        var modified = toDouble(modArray);
        snippet.log('Result: ' + modified)
        <!-- Provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
        <script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>

        【讨论】:

        • 当您添加用于获取数据的代码进入代码sn-p,并获得一个结果from代码sn-p,是比代码 sn-p 本身更长,我认为你应该重新评估你的优先级......
        • @Cerbrus 抱歉...没找到你
        • 我的意思是:实际回答问题的代码有 5 行长。然后添加 13 行不相关的代码来处理 in / output。伊莫,这有点过分了。
        • @Cerbrus 是的...在小提琴中我最初用来测试它...我使用了一个静态数组...
        【解决方案6】:
        function toDouble(modArray) {
            var modified = new Array();
            for (var i = 0; i < modArray.length; i++) {
                if (i % 2 == 0)
                    modified.push(modArray[i]);
                else
                    modified.push(modArray[i] * 2);
            }
            return modified;
        }
        

        例子:

        var a = [1, 2, 3, 4, 5]
        
        toDouble(a); // output: [1, 4, 3, 8, 5]
        

        【讨论】:

          【解决方案7】:

          您只需对代码进行一些更改:

          function toDouble(modArray) {
             var modified = modArray.slice(0); // copy the whole `modArray`
             for(var i = 1; i < modified.length; i+=2) {
                modified[i] *= 2; // replace the value at `i`, for every other number.
             }
             return modified;
          }
          
          var a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
              b = toDouble(a);
          
          alert(JSON.stringify(b));

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2022-01-14
            • 2015-01-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-05-28
            • 2022-12-22
            相关资源
            最近更新 更多