Для такой проблемы вы должны заботиться о меньше о вычислительных затратах на создание нового массива, а о больше о расходах Big O, проходящих через несколько массивов несколько раз , И ваше решение, и другое, опубликованное @NitishNarang, выглядят как O (n ^ 2), потому что по мере увеличения ваших массивов количество шагов, необходимых для решения, увеличивается в геометрической прогрессии.
Лично я просто создал бы новый Map()
и прошел бы по каждому элементу один за другим, добавив его к Map()
, только если значение a
, соответствующее этому идентификатору, больше, чем сохраненное в данный момент. По сути, это немного более сложное упражнение по сортировке, за исключением добавления уникальных значений идентификаторов.
const x = [{id: 1, a: 5}, {id: 2, a:10}, {id: 3, a: 12}];
const y = [{id: 4, a: 0}, {id: 2, a: 0}, {id: 3, a: 0}];
const myMap = new Map();
for (const ea of x) {
if (!myMap.has(ea.id) || ea.a >= myMap.get(ea.id).a) {
myMap.set(ea.id, ea);
}
}
for (const ea of y) {
if (!myMap.has(ea.id) || ea.a >= myMap.get(ea.id).a) {
myMap.set(ea.id, ea);
}
}
const result = [...myMap.values()];
Это решение O (n), т. Е. Оно линейное. Это означает, что если вы добавите в массив 10, 100 или 1000 элементов x
, y
или и то, и другое, это только добавит еще много шагов к выполнению. решение вместо 10 ^ 2 или 100 ^ 2 или 1000 ^ 2, потому что вы должны проверять каждый отдельный элемент в каждом массиве на предмет соответствия каждому другому элементу в другом массиве (как вы делаете с вашим исходным решением.)
Редактировать: как указывало @SZenC, приведенное выше решение не совсем корректно, поскольку оно объединяет оба массива. Чтобы выборочно сопоставлять элементы только в том случае, если они изначально существуют в массиве y
, просто сначала выполните итерацию по y
, а затем заменяйте значения только при выполнении итерации по x
, если они уже присутствуют на карте:
const x = [{id: 1, a: 5}, {id: 2, a:10}, {id: 3, a: 12}];
const y = [{id: 4, a: 0}, {id: 2, a: 0}, {id: 3, a: 0}];
const myMap = new Map();
for (const ea of y) {
if (!myMap.has(ea.id) || ea.a >= myMap.get(ea.id).a) {
myMap.set(ea.id, ea);
}
}
for (const ea of x) {
if (myMap.has(ea.id) && ea.a >= myMap.get(ea.id).a) {
myMap.set(ea.id, ea);
}
}
const result = [...myMap.values()];