Объединить элементы массива на основе их ключевых значений

Я хотел бы объединить два разных массива в один массив на основе положения элементов внутри них.

Массив, который у меня есть сейчас:

var firstName = {'John','Joe','Kees'};
var lastName = {'Smith','Fisherman','Cow'};

Результат, который я хотел бы получить:

var name = {'John Smith', 'Joe Fisherman', 'Kees Cow'};

person Tom Roskam    schedule 22.04.2021    source источник
comment
То, что вы пытаетесь сделать, похоже на сжатие массивов. Возможно, этот вопрос поможет вам найти правильный путь: stackoverflow.com/questions/22015684/ Или немного проще перебирает 1 массив, добавляя значения второго массива по индексу, что должно работать, если массивы имеют одинаковую длину: stackoverflow.com/questions/34076624 /   -  person fravolt    schedule 22.04.2021
comment
Вы показываете объект, но не массив. Вы уверены, что это объект/массив?   -  person Dipak Telangre    schedule 22.04.2021


Ответы (3)


Array.prototypr.map имеет перегруженный вариант, который получает как значение, так и индекс каждого значения во время итерации. Вы можете использовать его для сопоставления каждого значения firstName с соответствующим lastName:

var firstName = ['John','Joe','Kees'];
var lastName = ['Smith','Fisherman','Cow'];

var name = firstName.map((value, index) => value + ' ' + lastName[index]);

console.log(name);

person Mureinik    schedule 22.04.2021
comment
Большое спасибо! Я знал, что это должно быть что-то простое. - person Tom Roskam; 22.04.2021

Мы можем использовать Array#map для отображения между двумя заданными массивами.

В каждой map итерации возьмите firstName f из первого массива и соответствующий ему индекс i и используйте его, чтобы получить полное имя, объединив firstName и lastName из индекса i:

var firstName = ['John','Joe','Kees'];
var lastName = ['Smith','Fisherman','Cow'];

const combine = (firstName, lastName) => {
  return firstName.map((f, i) => `${f} ${lastName[i] || ""}`);
}

console.log(combine(firstName, lastName));

person Fullstack Guy    schedule 22.04.2021

Я сделал это. Но это не экономия памяти или времени. Вы можете сделать более быструю версию с помощью цикла for.

Удачи.

let firstName = ['John','Joe','Kees'];
let lastName = ['Smith','Fisherman','Cow'];


const combiner = (firstArray, secondArray) => Array(Math.max(firstArray.length, secondArray.length)).fill('').map((_, i) => `${firstArray[i] || ''} ${secondArray[i] || ''}`.trim());

// редактировать: с циклом for

const fasterCombiner = (fa, sa) => {
  let result = [], length = fa.length > sa.length ? fa.length : sa.length;
  for(let i = 0; i < length; i++ ) {
    result.push(`${fa[i] || ''} ${sa[i] || ''}`.trim());
  }
  return result;
}
person Aykhan Huseyn    schedule 22.04.2021