Объединение двух многомерных массивов в Javascript по значению

У меня есть два массива:

var array1 = [['email1', object1],['email2', object2],['email3', object3],['email4',object4]]
var array2 = [['email1',[['a1','b1']]],['email3',[['a3','b3']]], ['email4',[['a4','b4'],['a4a','b4a']]]

Мне нужно объединить их по электронной почте, чтобы результирующий массив выглядел без дублирования электронной почты:

var mergedarray = 
[['email1', object1, [['a1', 'b1']]],['email2', object2],['email3', object3, ['a3', 'b3']],['email4',object4,[['a4','b4'],['a4a','b4a']]]]

Мой мозг болит, когда я смотрю на эти мультимультимерности... Какой-нибудь совет?

Разве они не должны быть струнами...?

Jack Bashford 29.05.2019 12:23

Откуда [] на второй позиции в результате?

Jack Bashford 29.05.2019 12:24

Это ужасный способ хранения данных.

Kobe 29.05.2019 12:29

Что, если они станут неупорядоченными... что, если номера электронной почты сломаются... как это будет работать?

Jack Bashford 29.05.2019 12:33

@JackBashford Они уже неупорядочены, вы можете видеть, что в массиве2 отсутствует «email2». Мне нужно объединить их по строковому значению электронной почты

Sam Tyurenkov 29.05.2019 12:35
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
5
76
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

   const hash = new Map();

   for(const [email, ...rest] of [...array1, ...array2]) {
     if (hash.has(email)) {
       hash.get(email).push(...rest);
     } else {
        hash.set(email, [email, ...rest]);
    }
  }

  const result = [...hash.values()];

Создайте карта массива2 для более быстрого поиска и используйте Array.prototype.map для первого массива или наоборот.

var array1 = [['email1', 'object1'], ['email2', 'object2'], ['email3', 'object3'], ['email4', 'object4']]
var array2 = [['email1', [['a1', 'b1']]], ['email3', [['a3', 'b3']]], ['email4', [['a4', 'b4'], ['a4a', 'b4a']]]]

let map2 = new Map(array2);

let out = array1.map(([key, val]) => [key, val, map2.get(key) || []]);
console.info(out)

Вы можете сопоставить второй массив и проверить, находится ли первый элемент в каком-либо из массивов в первом массиве, а затем нажать второй элемент, если он возвращает true:

var array1 = [['email1', 'object1'],['email2', 'object2'],['email3', 'object3'],['email4','object4']]
var array2 = [['email1',[['a1','b1']]],['email3',[['a3','b3']]], ['email4',[['a4','b4'],['a4a','b4a']]]]

array2.forEach((arr2, i2) => {
  array1.map((arr1, i1) => {
    if (arr1[0] == arr2[0]) {
      array1[i1].push(array2[i2][1])
    }
  })
})

console.info(array1)
Ответ принят как подходящий

Не смог реализовать ни один из советов (вероятно, из-за моего низкого навыка), в итоге я превратил массивы в объекты для назначения пар ключ-значение, поэтому новые данные выглядели так:

var array1 = [{email:'email1', obj:object1, data:[]},{email:'email2', obj:object2, data:[]},{email:'email3', obj:object3, data:[]},{email:'email4',obj:object4, data:[]}];
var array2 = [{email:'email1',data:[{'a1','b1'}]},{email:'email3',data:[{'a3','b3'}]}, {email:'email4',data:[{'a4','b4'}]},{email:'email4',data:[{'a4a','b4a'}]}];

После этого я использовал цикл для передачи данных объектов из одного массива в другой:

 for (var x in array1) {
    var res = array1[x].email;

    for (var z in array2) {
      var cod = array2[z].email;
      var q = 0;
      if (res == cod) {
        array1[x].data.push(array2[z].data[0]);
        q++;
      }

    }
  }

И результат:

var array1 = [{email:'email1',obj:object1,data:[{'a1','b1'}]},{email:'email2',obj:object2,data:[]},{email:'email3',data:[{'a3','b3'}]},{email:'email4',obj:object4,data:[{'a4','b4'},{'a4a','b4a'}]}];

Другие вопросы по теме