【问题标题】:How to extract first element of each child array in multidimensional array?如何提取多维数组中每个子数组的第一个元素?
【发布时间】:2019-09-30 11:00:28
【问题描述】:

我有一个多维数组:

var array 1 = 

[

 [[Name 1, 2, Nigeria], 
  [Name 3, 52, Egypt], 
  [Name 5, 75, South Africa]]

 [[Name 5, 8, Nigeria], 
  [Name 1, 62, Egypt], 
  [Name 3, 115, South Africa]]

 [[Name 6, 88, Nigeria], 
  [Name 3, 92, Egypt], 
  [Name 5, 825, South Africa]]

 ]

我想要一个新的平面数组:

var array 2 = [Name 1, Name 3, Name 5, Name 5, Name 1, Name 3, Name 6, Name 3, Name 5]

我尝试过编写一个映射数组并返回第一个元素的函数:

function name(filteredName){
filteredName.map(function(firstName){
  return firstName[0]
}) 

}

但是,这只是返回:

[Name 1, Name 1, Name 1] 

我真的不知道如何解决这个问题!任何帮助都会很棒。

【问题讨论】:

  • name 应该是键,1 应该是 name 的值吗?什么是名称和国家?这些是类型还是字符串?
  • 不,这是完整的元素。如果是键/值会更容易。
  • 比如 Name = 1 和 Nigeria = 2 或 Name = [1, 2] 和 Nigeria = undefined?
  • 提供minimal reproducible example。你怎么打电话给name()?如果你打电话给name(array1),它不会返回任何东西。您的数组也不是数组。它在语法上是不准确的。您的示例既不完整也不可验证。

标签: javascript multidimensional-array google-apps-script


【解决方案1】:

您可以使用嵌套的map(),然后使用flat()

var arr = [ [['Name 1', 2, 'Nigeria'], ['Name 3', 52, 'Egypt'], ['Name 5', 75, 'South Africa']], [['Name 5', 8, 'Nigeria'], ['Name 1', 62, 'Egypt'], ['Name 3', 115, 'South Africa']], [['Name 6', 88, 'Nigeria'], ['Name 3', 92, 'Egypt'], ['Name 5', 825, 'South Africa']] ];
 
   const res = arr.map(x => x.map(a => a[0])).flat(2)
   console.log(res)

没有flat()

您可以在不使用 flat() 的情况下使用 concat() 和扩展运算符来做到这一点。

var arr = [ [['Name 1', 2, 'Nigeria'], ['Name 3', 52, 'Egypt'], ['Name 5', 75, 'South Africa']], [['Name 5', 8, 'Nigeria'], ['Name 1', 62, 'Egypt'], ['Name 3', 115, 'South Africa']], [['Name 6', 88, 'Nigeria'], ['Name 3', 92, 'Egypt'], ['Name 5', 825, 'South Africa']] ];
 
 const res = [].concat(...arr.map(x => x.map(x => x[0])))
 console.log(res)

【讨论】:

  • 谢谢。虽然 Google App Script 使用 ES5,所以没有箭头函数。
【解决方案2】:

您可以像这样使用Array.flat()Array.map()

array1.flat().map(arr => arr[0]);

或者你可以使用Array.concat() 代替 Array.flat():

[].concat(...array1).map(arr => arr[0]);

工作示例

var array1 = [
 [
   ['Name 1', 2, 'Nigeria'], 
   ['Name 3', 52, 'Egypt'], 
   ['Name 5', 75, 'South Africa']
 ],

 [
   ['Name 5', 8, 'Nigeria'], 
   ['Name 1', 62, 'Egypt'], 
   ['Name 3', 115, 'South Africa']
 ],

 [
   ['Name 6', 88, 'Nigeria'], 
   ['Name 3', 92, 'Egypt'], 
   ['Name 5', 825, 'South Africa']
 ]
];

const NamesArr = array1.flat().map(arr => arr[0]);

console.log(NamesArr);
console.log('Array.concat():');
console.log([].concat(...array1).map(arr => arr[0]));

【讨论】:

    【解决方案3】:

    您可以像这样使用mapflatMap 的组合:

    const array1 = [ [['Name 1', 2, 'Nigeria'], ['Name 3', 52, 'Egypt'], ['Name 5', 75, 'South Africa']], [['Name 5', 8, 'Nigeria'], ['Name 1', 62, 'Egypt'], ['Name 3', 115, 'South Africa']], [['Name 6', 88, 'Nigeria'], ['Name 3', 92, 'Egypt'], ['Name 5', 825, 'South Africa']] ];
    
    const output = array1.flatMap(a => a.map(b => b[0]))
    
    console.log(output)

    如果不支持flatMap,您可以使用简单的嵌套for...of 循环:

    var array1 = [ [['Name 1', 2, 'Nigeria'], ['Name 3', 52, 'Egypt'], ['Name 5', 75, 'South Africa']], [['Name 5', 8, 'Nigeria'], ['Name 1', 62, 'Egypt'], ['Name 3', 115, 'South Africa']], [['Name 6', 88, 'Nigeria'], ['Name 3', 92, 'Egypt'], ['Name 5', 825, 'South Africa']] ];
    
    var output = [];
    
    for (var arr of array1) {
      for (var arr2 of arr) {
        output.push(arr2[0])
      }
    }
    
    console.log(output)

    【讨论】:

      【解决方案4】:

      我遍历第一个数组。在那个循环中,我遍历第二个并推送第一个条目。

      var array = [
      
       [['Name 1', 2, 'Nigeria'], 
        ['Name 3', 52, 'Egypt'], 
        ['Name 5', 75, 'South Africa']],
      
       [['Name 5', 8, 'Nigeria'], 
        ['Name 1', 62, 'Egypt'], 
        ['Name 3', 115, 'South Africa']],
      
       [['Name 6', 88, 'Nigeria'], 
        ['Name 3', 92, 'Egypt'], 
        ['Name 5', 825, 'South Africa']],
       ];
       
      var result = []
      
      for (var i = 0; i < array.length; i++) {
        for (var j = 0; j < array[i].length; j++) {
          result.push(array[i][j][0])
        }
      }
      
      console.log(result)

      【讨论】:

        【解决方案5】:

        你也可以使用 forEach 和 spread 语法来做到这一点

        var flatArr = [];
        
        array_1.forEach((arr, i) => {
            arr.forEach(innerArr => {
                flatArr = [...flatArr, innerArr[0]]
            })
        });
        

        【讨论】:

          【解决方案6】:

          在使用.map 之前,先将您的数组展平。这样,您将不会使用多维数组,并且更容易获取每个数组的第一个元素:

          var arr = 
          [
           [['Name 1', 2, 'Nigeria'], 
            ['Name 3', 52, 'Egypt'], 
            ['Name 5', 75, 'South Africa']],
          
           [['Name 5', 8, 'Nigeria'], 
            ['Name 1', 62, 'Egypt'], 
            ['Name 3', 115, 'South Africa']],
          
           [['Name 6', 88, 'Nigeria'], 
            ['Name 3', 92, 'Egypt'], 
            ['Name 5', 825, 'South Africa']]
          
           ]
           
           
           console.log(arr.flat().map(item => item[0]))

          通知

          .flat 还没有大量支持,如果您想使用最新的代码标准,可以使用 polyfill 或使用扩展运算符来展平您的数组:

          var arr = 
          [
           [['Name 1', 2, 'Nigeria'], 
            ['Name 3', 52, 'Egypt'], 
            ['Name 5', 75, 'South Africa']],
          
           [['Name 5', 8, 'Nigeria'], 
            ['Name 1', 62, 'Egypt'], 
            ['Name 3', 115, 'South Africa']],
          
           [['Name 6', 88, 'Nigeria'], 
            ['Name 3', 92, 'Egypt'], 
            ['Name 5', 825, 'South Africa']]
          
           ]
           
           
           console.log([].concat(...arr).map(item => item[0]))

          【讨论】:

          • 由于某些原因,我有 "TypeError: arr.flat is not a function" 这适用于所有使用诸如flat()map()、@ 等方法的答案987654328@
          • 使用火狐60.6.3
          • 你们是 100% 正确的,.flat 已在 firefox 62 中引入。无论如何,给了你一个替代方案
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-11-01
          • 2015-07-08
          • 2018-02-01
          • 2021-10-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多