Как извлечь первый элемент каждого дочернего массива в многомерный массив? - PullRequest
0 голосов
/ 13 мая 2019

У меня есть многомерный массив:

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] 

Я действительно не уверен, как решить эту проблему! Любая помощь будет великолепна.

Ответы [ 6 ]

2 голосов
/ 13 мая 2019

Вы можете использовать вложенные 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)
1 голос
/ 13 мая 2019

Вы можете использовать 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]));
1 голос
/ 13 мая 2019

Вы можете использовать комбинацию map и flatMap, например:

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 голос
/ 13 мая 2019

Я зацикливаюсь на первом массиве. В этом цикле я зацикливаюсь на втором и нажимаю на первую запись.

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 голосов
/ 13 мая 2019

вы также можете сделать это с помощью forEach и распространить синтаксис

var flatArr = [];

array_1.forEach((arr, i) => {
    arr.forEach(innerArr => {
        flatArr = [...flatArr, innerArr[0]]
    })
});
0 голосов
/ 13 мая 2019

Свести массив перед использованием .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]))
...