【问题标题】:How to loop through a nested array and then to store the output in a predefined order using Javascript如何遍历嵌套数组,然后使用 Javascript 以预定义的顺序存储输出
【发布时间】:2021-04-23 04:03:29
【问题描述】:

编辑 18.01.21(查看螺栓更改)

我在想办法循环遍历嵌套数组然后以所需顺序存储输出时遇到问题。您能否帮我找出一种方法来完成这项工作或指出我做错了什么?

我想我在这个过程中遗漏了几个步骤。例如,在某个时候打破内部循环并临时存储我的数据。但是,我不确定在什么时候...重要的是要提一下,该代码旨在用于 Google Apps 脚本

我使用的玩具数据如下所示: 我在我的玩具数据中添加了另一种类型的关键字——“十字交叉”和“bob ross”。

var keywords =  [ [ ["claude"],["clair"],["carl"], ["criss cross"] ],
                [ ["brad"],["bob"],["bill"] ["bob ross"] ] ];

我希望实现的输出如下所示:

[ [ [ '[claude] '],[ '"claude"' ],[ '+claude' ] ],
[ [ '[clair]' ],[ '"clair"' ],[ '+clair' ] ],
[ [ '[carl]' ],[ '"carl"' ],[ '+carl' ] ],
[ [ '[criss cross]' ],[ '"criss cross"' ], [ '+criss +cross' ] ],
[ [ '[brad]' ],[ '"brad"' ],[ '+brad' ] ],
[ [ '[bob]' ],[ '"bob"' ],[ '+bob' ] ],
[ [ '[bill]' ],[ '"bill"' ],[ '+bill' ] ],
[ [ '[bob ross]' ],[ '"bob ross"' ], [ '+bob +ross' ] ] ]

但是,我正在创建的输出如下:

[ [ [ '[claude]' ],[ '[clair]' ],[ '[carl]' ],[ '[brad]' ],[ '[bob]' ],[ '[bill]' ] ],
[ [ '"claude"' ],[ '"clair"' ],[ '"carl"' ],[ '"brad"' ],[ '"bob"' ],[ '"bill"' ] ],
[ [ '+claude' ],[ '+clair' ],[ '+carl' ],[ '+brad' ],[ '+bob' ],[ '+bill' ] ] ]

这是我使用的代码:

var keywords =  [[["claude"],["clair"],["carl"]],
                [["brad"],["bob"],["bill"]]];

var keywords = [].concat.apply( [], keywords );
const PERMUTATION = function permuation( item ) {
    var exact = [];
    var phrase = [];
    var modyfied = [];
      
    for( let i = 0 ; i < item.length ; i++ ) {
    
      var output1 = "[" + item[i] + "]";
      exact.push([output1]);
    
      var output2 = '"' + item[i] + '"';
      phrase.push([output2]);
    
      var temp = [item[i][0].split(" ").map( i => "+" + i ).join(" ")];
      modyfied.push(temp);
    }
    return new Array( exact, phrase, modyfied ) ;
  }

  var output = PERMUTATION(keywords);
  console.log(output)

【问题讨论】:

    标签: javascript arrays for-loop google-apps-script nested


    【解决方案1】:

    您可以展平数组并映射所需的样式。

    const
        keywords = [[["clau de"], ["clair"], ["carl"]], [["brad"], ["bob"], ["bill"]]],
        result = keywords
            .flat(Infinity)
            .map(v => [`[${v}]`, `"${v}"`, v.split(' ').map(v => `+${v}`).join(' ')].map(v => [v]));
    
    console.log(result);
    .as-console-wrapper { max-height: 100% !important; top: 0; }

    【讨论】:

    • 感谢您的意见,妮娜。我稍微编辑了我的问题。我向我的玩具数据集添加了另外两个关键字——“十字交叉”和“鲍勃·罗斯”。如果我理解正确,您的代码将返回 [+bob ross] 作为输出。但是,我需要 [+bob +ross] 作为输出。这就是我在上一个声明中使用.split和.join的原因。是否可以相应地更改您的代码?事实上,有问题的关键字可能比两个词长。所以代码在这方面需要灵活。
    【解决方案2】:
    const keywords =  [[["claude"],["clair"],["carl"]],
                    [["brad"],["bob"],["bill"]]];
    
    keywords.flat(2).reduce((acc, key) => {
      const nestArr = [ [`[${key}]`], [`"${key}"`], [`+${key}`] ];
            
      return [...acc, nestArr];
    } , []);
    

    【讨论】:

    • 感谢您的意见,伊万。您的代码有效。但是,我稍微编辑了我的问题。我向我的玩具数据集添加了另外两个关键字——“十字交叉”和“鲍勃·罗斯”。如果我理解正确,您的代码将返回 [+bob ross] 作为输出。但是,我需要[+bob +ross] 作为输出。这就是我在上一个声明中使用.split和.join的原因。是否可以相应地更改您的代码?需要注意的是,关键字可能不仅仅是两个词。 ["this is a test"] 也有可能。
    【解决方案3】:

    解决方案

    var keywords = [
      [["claude"], ["clair"], ["carl"]],
      [["brad"], ["bob"], ["bill"]],
    ];
    
    let result = keywords
      .flatMap((i) => i)
      .map((keyword) =>
        ["[key]", '"key"', "+key"].map((currentKey) => [
          currentKey.replace(/key/g, keyword[0]),
        ])
      );
    
    console.log(result);

    【讨论】:

      【解决方案4】:

      我不确定结果应该是什么,但电子表格的结构如下所示:

      COL1 COL2 COL3 COL4 COL5
      1 2 3 4 5
      6 7 8 9 10
      11 12 13 14 15
      16 17 18 19 20
      21 22 23 24 25
      26 27 28 29 30
      31 32 33 34 35
      36 37 38 39 40
      41 42 43 44 45

      可以通过以下代码获取:

      function getData() {
        const s=JSON.stringify(SpreadsheetApp.getActiveSheet().getDataRange().getValues());
        SpreadsheetApp.getUi().showModelessDialog(HtmlService.createHtmlOutput('<textarea rows="12" cols="60">' + s + '</textarea>'),"Title");
      }
      

      输出如下:

      [["COL1","COL2","COL3","COL4","COL5"],
      [1,2,3,4,5],
      [6,7,8,9,10],
      [11,12,13,14,15],
      [16,17,18,19,20],
      [21,22,23,24,25],
      [26,27,28,29,30],
      [31,32,33,34,35],
      [36,37,38,39,40],
      [41,42,43,44,45]]
      

      因此,您可以根据自己想要的结果来判断。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-06-16
        • 2013-08-06
        • 1970-01-01
        • 1970-01-01
        • 2021-08-18
        • 2010-12-06
        • 1970-01-01
        • 2023-03-13
        相关资源
        最近更新 更多