Цикл по двумерному массиву и извлечение данных в новый - PullRequest
0 голосов
/ 24 мая 2018

У меня есть двумерный массив примерно так:

const bArray = 
[ [ 'Hello World',
    'Hi everybody',
    'How are you?'
  ],
  [ { text: 'Hola Mundo',
      from: [Object],
      raw: '' },
    { text: 'Hola a todos',
      from: [Object],
      raw: '' },
    { text: 'Cómo estás?',
      from: [Object],
      raw: '' },
  ]
]

И мне нужно получить только один массив, который должен выглядеть так:

[
 { en: 'Hello World',
   es: 'Hola Mundo' },

 { en: 'Hi everybody',
   es: 'Hola a todos' },

 { en: 'How are you?',
   es: 'Cómo estás?' },
]

Вот как я это делаю:

let val1 = bArray[0].map(tuple => tuple);
let val2 = bArray[1].map(tuple => tuple);

let result = val1.reduce((arr, v, i) => arr.concat({"en" : v, "es" : val2[i].text}), []);

А теперь в переменной result у меня есть только один массив с показанным ранее результатом.


Мой вопрос?

Есть ли какой-нибудь улучшенный способ, которым я могу получить тот же результат, но с меньшим количеством строк кода?Я имею в виду что-то вроде комбинации map с reduce, filter или concat без создания двух отдельных массивов, таких как val1 и val2.

Ответы [ 3 ]

0 голосов
/ 24 мая 2018

Если вы просто сделаете:

bArray[0].reduce((arr, v, i) => arr.concat({"en" : v, "es" : bArray[1][i].text}), []);

Вы можете получить одно и то же в одной строке.

Объяснение:

let val1 = bArray[0].map(tuple => tuple);
let val2 = bArray[1].map(tuple => tuple);

Это ничего не делает, кроме как получить элементы в массиве.Это то же самое, что и

let val1 = bArray[0];
let val2 = bArray[1];

Так что я просто обратился к индексам bArray в вашей исходной строке.

0 голосов
/ 24 мая 2018

Еще один вариант с использованием Array.prototype.forEach() метода

let result = [];
bArray[0].forEach((item, index) => {
   result.push({
     en: item,
       es: bArray[1][index].text
   });
});

console.log(result);
0 голосов
/ 24 мая 2018

Я предполагаю, что во внешнем массиве будет только два массива.Вам просто нужно зациклить первый массив и выбрать текст из другого массива с тем же индексом и объединить их в один объект.

const bArray = 
[ [ 'Hello World',
    'Hi everybody',
    'How are you?'
  ],
  [ { text: 'Hola Mundo',
      from: [],
      raw: '' },
    { text: 'Hola a todos',
      from: [],
      raw: '' },
    { text: 'Cómo estás?',
      from: [],
      raw: '' },
  ]
];

let result = bArray[0].map((item, index) => {
   return {
     en: item,
     es: bArray[1][index].text
   };
});

console.log(result);
...