简体   繁体   English

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

[英]How to extract first element of each child array in multidimensional array?

I have a multidimensional array: 我有一个多维数组:

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]]

 ]

I want to have a new flat array: 我想要一个新的平面数组:

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

I've tried writing a function that maps over the array and returns the first element: 我尝试编写一个映射到数组并返回第一个元素的函数:

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

} }

However, this just returns: 但是,这仅返回:

[Name 1, Name 1, Name 1] 

I'm really not sure how to solve this! 我真的不确定如何解决这个问题! Any help would be great. 任何帮助都会很棒。

You can use nested map() and then flat() 您可以使用嵌套的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) 

Without flat() 没有flat()

You can do that without using flat() using concat() and spread operator. 您可以使用concat()和spread运算符而无需使用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) 

I loop over the first array. 我遍历第一个数组。 In that loop, I loop over the second one and push the first entry. 在该循环中,我遍历第二个并推入第一个条目。

 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) 

You could use a combination of map and flatMap like this: 您可以像这样使用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) 

If flatMap is not supported, you could use a simple nested for...of loop: 如果不支持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) 

You can use Array.flat() and Array.map() like this: 您可以使用Array.flat()Array.map()是这样的:

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

Or you can use Array.concat() instead of Array.flat(): 或者你可以使用Array.concat()代替Array.flat():

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

Working example : 工作示例

 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])); 

Flatten your array before using .map . 在使用.map之前,将数组展平。 That way, you will not be working with a multidimensional array and it will be easier to get the first element of each array: 这样,您将不再使用多维数组,并且更容易获得每个数组的第一个元素:

 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])) 

Notice 注意

.flat does not have huge support yet, you can either use a polyfill if you want to use the latest code standard or use the spread operator to flatten your array: .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']] ] console.log([].concat(...arr).map(item => item[0])) 

you could also do it with forEach and spread syntax 你也可以用foreach和传播语法做

var flatArr = [];

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM