【问题标题】:Mapping two dimensions array in Javascript在Javascript中映射二维数组
【发布时间】:2018-11-07 09:20:50
【问题描述】:

输入一个二维数组,我需要得到一个包含大写元素的数组作为输出。

这是我的尝试,但它不起作用。

var cityColumn = [['avila'], ['burgos'], ['madrid'], ['sevilla']];
var cityRow = [['avila', 'avila', 'burgos', 'madrid', 'sevilla']];
var cityCell = [['sevilla']];


console.log(cityRow);
function upperCaseArray(myArray) {
  var upperized = myArray.map(function(city){
    console.log(typeof city);
    return city.toUpperCase();
  });
  return upperized;
}

console.log(upperCaseArray(cityColumn));
console.log(upperCaseArray(cityRow));
console.log(upperCaseArray(cityCell));
// output desired:
// [['AVILA], ['BURGOS'], ['MADRID'], ['SEVILLA']]
// [['AVILA, 'AVILA', 'BURGOS', 'MADRID', SEVILLA']]
// [['SEVILLA']]

注意:这些输入是我从 Google 表格范围 SpreadsheetApp.getActiveSpreadsheet().getSelection().getActiveRange().getValues() 获得的。我正在开始编写 Google Apps 脚本。

【问题讨论】:

    标签: javascript arrays string google-apps-script map-function


    【解决方案1】:

    因为您的字符串嵌套在数组本身的数组中,所以您需要 两个 .maps:

    var cityColumn = [['avila'], ['burgos'], ['madrid'], ['sevilla']];
    var cityRow = [['avila', 'avila', 'burgos', 'madrid', 'sevilla']];
    var cityCell = [['sevilla']];
    function upperCaseArray(arr) {
      return arr.map(function(subarr) {
        return subarr.map(function(str) {
          return str.toUpperCase();
        });
      });
    }
    console.log(upperCaseArray(cityColumn));
    console.log(upperCaseArray(cityRow));
    console.log(upperCaseArray(cityCell));

    【讨论】:

      【解决方案2】:

      var cityColumn = [['avila'], ['burgos'], ['madrid'], ['sevilla']];
      var cityRow = [['avila, avila, burgos, madrid, sevilla']];
      var cityCell = [['sevilla']];
      
      
      console.log(cityRow);
      function upperCaseArray(arr) {
        return arr.map(a => a.map(item => item.toUpperCase()));
        }
      
      console.log(upperCaseArray(cityColumn));
      console.log(upperCaseArray(cityRow));
      console.log(upperCaseArray(cityCell));

      【讨论】:

        【解决方案3】:

        首先,数组中的元素需要用引号括起来 "' 以将它们标记为字符串,否则解释器会将它们视为未定义的变量。

        您可以使用map 函数将函数应用于数组中的所有元素。但由于这是一个二维数组,您需要以嵌套方式应用它,如下所示:

        var cityColumn = [["avila"], ["burgos"], ["madrid"], ["sevilla"]];
        var cityRow = [["avila", "avila", "burgos", "madrid", "sevilla"]];
        var cityCell = [["sevilla"]];
        
        function arrUpper(arr) {
            // o as in outer, and i as in inner
            return arr.map(o => o.map(i => i.toUpperCase()));
        }
        
        console.log(arrUpper(cityColumn));
        console.log(arrUpper(cityRow));
        console.log(arrUpper(cityCell));

        输出

        [["AVILA"], ["BURGOS"], ["MADRID"], ["SEVILLA"]]
        [["AVILA", "AVILA", "BURGOS", "MADRID", "SEVILLA"]]
        [["SEVILLA"]]
        

        【讨论】:

        • IIRC,Rhino (GAS) 不支持 ES6 语法,很遗憾
        【解决方案4】:

        我必须在字符串中添加单引号。

        var cityColumn = [['avila'], ['burgos'], ['madrid'], ['sevilla']];
        var cityRow = [['avila, avila, burgos, madrid, sevilla']];
        var cityCell = [['sevilla']];
        
        
        console.log(cityRow);
        function upperCaseArray(arr) {
          return arr.map(a => a.map(item => item.toUpperCase()));
          }
        
        console.log(upperCaseArray(cityColumn));
        console.log(upperCaseArray(cityRow));
        console.log(upperCaseArray(cityCell));

        【讨论】:

        • IIRC,Rhino (GAS) 不支持 ES6 语法,很遗憾
        • 我没有关注。为什么要支持 Rhino (GAS)?
        • 因为 OP 使用 GAS(在 Rhino 上运行)
        【解决方案5】:

        您可以通过join() 数组将数组设为字符串。然后将字符串大写。最后split()他们再次从数组中出来。

        改变

        return city.toUpperCase();
        

        return city.join(',').toUpperCase().split(',');
        

        var cityColumn = [['avila'], ['burgos'], ['madrid'], ['sevilla']];
        var cityRow = [['avila', 'avila', 'burgos', 'madrid', 'sevilla']];
        var cityCell = [['sevilla']];
        
        function upperCaseArray(myArray) {
          var upperized = myArray.map(function(city){
            return city.join(',').toUpperCase().split(',');
          });
          return upperized;
        }
        
        console.log(upperCaseArray(cityColumn));
        console.log(upperCaseArray(cityRow));
        console.log(upperCaseArray(cityCell));

        【讨论】:

          【解决方案6】:

          您可以递归地使用map

          function toUpper(arr){
            if(arr.map){
             return arr.map(toUpper);
            } else {
             return arr.toUpperCase();
            }
          }
          

          二维数组的递归深度为 2。GAS 最多支持 1000。

          【讨论】:

            【解决方案7】:
            var cityColumn = [['avila'], ['burgos'], ['madrid'], ['sevilla']];
            var cityRow = [['avila', 'avila', 'burgos', 'madrid', 'sevilla']];
            var cityCell = [['sevilla']];
            
            function parseData(input){
                    return input.reduce(function(o,i){
                        return i.reduce(function(oo,ii){
                            oo.push(ii.toUpperCase());
                            return oo;
                        },[]);
                    },[]);
                }
            
            console.log(parseData(cityCell));
            console.log(parseData(cityRow));
            console.log(parseData(cityColumn));
            

            【讨论】:

            • 当您将一个数组中的每个元素转换为另一个数组中的元素时,.map 可能比 reduce 更合适
            • .map 会改变原来的对象本身,而不是你想要的。
            • 不,.map 不会改变原始数组。 (除了 splice、push、pop、shift、unshift、sort、reverse IIRC 之外,没有任何数组方法发生变异)
            • 如果它没有变异,那么它也会创建新对象
            • @CertainPerformance 在性能方面两者都差不多。最好使用 for 循环。在 github github.com/dg92/Performance-Analysis-JS 上找到了同样好的性能指标。看看它。
            【解决方案8】:

            您可以使用.map() 创建带有大写字符串的数组:

            let cityColumn = [['avila'], ['burgos'], ['madrid'], ['sevilla']];
            let cityRow = [['avila', 'avila', 'burgos', 'madrid', 'sevilla']];
            let cityCell = [['sevilla']];
            
            function upperCase(arr) {
               return arr.map(function(a) {
                  return a.map(function(s) { return s.toUpperCase(); });
               });
            };
            
            console.log(upperCase(cityColumn));
            console.log(upperCase(cityRow));
            console.log(upperCase(cityCell));
            .as-console-wrapper { max-height: 100% !important; top: 0; }

            【讨论】:

            • @CertainPerformance 感谢您的意见。我已经相应地更新了我的答案。
            猜你喜欢
            • 2016-11-22
            • 1970-01-01
            • 2021-01-24
            • 1970-01-01
            • 2018-06-10
            • 2011-01-10
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多