У меня есть два массива:
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']]]]
Мой мозг болит, когда я смотрю на эти мультимультимерности... Какой-нибудь совет?
Откуда []
на второй позиции в результате?
Это ужасный способ хранения данных.
Что, если они станут неупорядоченными... что, если номера электронной почты сломаются... как это будет работать?
@JackBashford Они уже неупорядочены, вы можете видеть, что в массиве2 отсутствует «email2». Мне нужно объединить их по строковому значению электронной почты
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'}]}];
Разве они не должны быть струнами...?