Половина вашей проблемы находится в этой строке:
if(Object.keys(resultObject)!==(Object.keys(objectArray[i])))
Это условие всегда оценивается как true
. Причина в том, что Object.keys
возвращает массив. Массивы сравниваются по ссылке; это означает, что операторы ==
, ===
, !==
и т.д. только проверяют, является ли левый массив тем же самым объектом, что и правый массив. Нет сравнения содержимого. Поскольку Object.keys
каждый раз возвращает массив новый , два массива не могут сравниваться на равных.
Однако, даже если бы это было сравнение по содержимому, это не делай что хочешь. Например, рассмотрим эти два объекта:
// resultObject
{ a: 1, b: 2 }
// objectArray[i]
{ b: 3, c: 4 }
Условие будет оценивать ['a', 'b'] !== ['b', 'c']
, что равно true
независимо от того, сравниваете ли вы по ссылке или по содержимому.
Ваша вторая попытка та же проблема - всегда вычислять до true
. Чтобы понять, почему, давайте заменим результаты Object.keys
:
if(['a', 'b'].includes(['b', 'c']) === false)
Метод includes
в основном задает следующий вопрос: «равен ли какой-либо из моих элементов аргументу?» Поскольку Object.keys
всегда создает массив строк, вы спрашиваете, равна ли какая-либо из этих строк массиву, чего никогда не будет. Левая сторона ===
всегда false
, поэтому условие в целом всегда будет true
.
В результате вы всегда делаете это (другая половина вашей проблемы ):
Object.assign(resultObject, objectArray[i]);
в приведенном выше примере это переопределяет клавишу b
в resultObject
, поскольку Object.assign
не может знать, что вы хотите пропустить ключи, которые уже были установлены.
Интуитивно вам нужно проверить, есть ли какие-либо ключи в objectArray[i]
, которых еще нет в resultObject
, а затем назначить только эти клавиши на resultObject
. Это означает, что вы должны рассматривать ключи objectArray[i]
один за другим.
Следующий код сделает это:
var currentObject = objectArray[i];
var keys = Object.keys(currentObject);
for (var l = keys.length, j = 0; j < l; j++) {
var key = keys[j];
if (resultObject[key] === undefined) {
resultObject[key] = currentObject[key];
}
}
Вы можете заменить им весь if
- в исходном коде, и тогда он должен работать.