如何从多维数组中提取每个子数组的第一个元素?

7

我有一个多维数组:

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] 

我真的不确定如何解决这个问题!任何帮助都将是巨大的帮助。


名字应该是键,1应该是名字的值吗?还有Name和Country是什么?它们是类型还是字符串? - Michael Cacciano
不,那是完整的元素。如果是键/值对会更容易。 - Ajay Ubhi
所以像Name = 1和Nigeria = 2,或者Name = [1, 2]和Nigeria = undefined这样? - Michael Cacciano
提供 [mcve]。你是如何调用 name() 的?如果你调用了 name(array1),它不会返回任何东西。你的数组也不是一个数组。它在语法上是不准确的。你的示例既不完整也不可验证。 - TheMaster
6个回答

9

您可以使用嵌套的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()

您可以使用concat()和展开运算符来完成此操作,而无需使用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 = [].concat(...arr.map(x => x.map(x => x[0])))
 console.log(res)


谢谢。虽然Google App Script使用ES5,所以没有箭头函数。 - Ajay Ubhi

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

您可以使用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)


1
我循环遍历第一个数组。在这个循环中,我循环遍历第二个数组并将第一个条目推入其中。

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)


0

你也可以使用forEach和展开语法

var flatArr = [];

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

0
在使用.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()flatMap()等方法时。 - Cid
使用 Firefox 60.6.3 - Cid
你们是100%正确的,.flat已经在Firefox 62中引入。无论如何,我给了你一个替代方案。 - Karl-André Gagnon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接