【问题标题】:Can you pass an array of index numbers to the array push method instead of specifying each index in push specifically您可以将索引号数组传递给数组 push 方法,而不是专门指定 push 中的每个索引吗
【发布时间】:2019-08-26 22:49:57
【问题描述】:

我想从另一个二维数组创建一个新的二维数组,保留原始数组中定义在变量中的特定列。

我有一个工作版本,它使用原始数组中哪些列的硬编码值来保留,但我需要一个使用变量的版本。

var data = [
             [1,5,7,8,9,98,56],
             [4,7,8,9,2,55,88],
             [3,3,4,3,3,24,11]
            ];

 var indexes2Keep = [0,2,6]; 

 data.forEach(function(row) {
    slicedData.push( [ row[2], row[4], row[6] ] );
 });

我如何使用变量 index2Keep 的值而不是在数组推送方法中对列进行硬编码来给出相同的结果。

谢谢

预期输出是:

slicedData = [
         [1,7,56],
         [4,8,88],
         [3,4,11]
        ];

【问题讨论】:

    标签: javascript google-apps-script google-sheets


    【解决方案1】:

    你可以使用Array.map/Array.filter:

    var data = [
             [1,5,7,8,9,98,56],
             [4,7,8,9,2,55,88],
             [3,3,4,3,3,24,11]
            ];
    
    var indexes2Keep = [0,2,6]; 
    var slicedData = data.map(function (row){
      return row.filter(function(_,i){
         return indexes2Keep.indexOf(i) !== -1
      })
    })
    //Alternatively
    var slicedData2 = data.map(function (row){
      return indexes2Keep.map(function(i){
         return row[i]
      })
    })
    console.log(slicedData)
    console.log(slicedData2)

    【讨论】:

      【解决方案2】:

      只需在该数组上调用 .map 即可将每个索引映射到行中该索引处的元素。

      data.forEach(function(row) {
          slicedData.push(indexes2Keep.map(function(index) {return row[index]}));
      });
      

      【讨论】:

        【解决方案3】:

        您可以为此使用map() 函数:

        slicedData.push(indexes2Keep.map(index => row[index]));

        【讨论】:

        • ES6 表示法很棒 - 如果 OP 不想支持旧版浏览器,这是一个不错的选择。
        • 我想如果原始代码使用var,老式的functions 可能会更好!
        猜你喜欢
        • 1970-01-01
        • 2014-01-13
        • 2019-12-31
        • 2013-01-27
        • 2017-12-09
        • 1970-01-01
        • 2021-02-12
        • 1970-01-01
        • 2021-04-01
        相关资源
        最近更新 更多