Есть два json-объекта с разным количеством элементов. В первом, допустим, 6 элементов с ключом segment, а во втором - 8. Можно ли как-то сравнить эти два json-объекта таким образом, чтобы алгоритм добавил к первому объекту 2 недостающих segment из второго? И насколько это ресурсо-затратно будет на клиенте?
Циклом пройти и добавить.
Для линейной асимптотики имеет смысл имеющиеся значения segment собрать предварительно.
let arr1 = [
{seg: 1},
{seg: 3},
{seg: 5}
];
let arr2 = [
{seg: 1},
{seg: 2},
{seg: 4}
];
// Собираем ключи из первого массива
let seglist = arr1.reduce((o, el) => (o[el.seg] = true, o), {});
// Проходим по второму
arr2.forEach(el => {
// Добавляем отсутствующие
if (!seglist[el.seg]) arr1.push(el);
});
console.log(arr1)
Если уникального поля для этого нет(Вопрос), можно в качестве ключа использовать сериализованный объект: JSON.stringify(el).
Если объекты слишком велики - многократная сериализация может стать слишком накладной.
Можно попробовать другой алгоритм, с сортировкой (асимптотика не лучше О(nlogn)):
let arr1 = [{name: 'Alex', city: 'Chicago', position: 'Junior Dev'}, {name: 'John', city: 'Chicago', position: 'Middle Dev'}, {name: 'David', city: 'Chicago', position: 'Team Lead'} ];
let arr2 = [{name: 'Alex', city: 'Chicago', position: 'Junior Dev'}, {name: 'John', city: 'Chicago', position: 'Team Lead'}, {name: 'Den', city: 'Chicago', position: 'Team Lead'} ];
// Выбираем наиболее уникальное(имеющее большее количество уникальных значений поле), здесь это name
// Группируем объекты по этому полю
let objlist = arr1.reduce((o, el) => {
if (!o[el.name]) o[el.name] = [];
o[el.name].push(el);
return o;
}, {});
const objEquals = (o1, o2) => {
// В общем случае, проверку здесь можно сделать более полной, например, если порядок ключей может различаться
return JSON.stringify(o1) === JSON.stringify(o2);
}
// Проходим по второму массиву
arr2.forEach(el => {
// Добавляем отсутствующие
if (!objlist[el.name]) arr1.push(el);
else {
// Некто с таким же именем уже есть в первом массиве
for (let i = 0; i < objlist[el.name].length; ++i) {
let o = objlist[el.name][i];
let exists = false
if (objEquals(o, el)) {
// Полное совпадение, выходим
exists = true;
break;
}
// Не нашли совпадения, дополняем первый массив
if (!exists) arr1.push(el);
}
}
});
console.log(arr1);
Для Проверка двух массивов на идентичность
var array = [
{ name: 'Alex', city: 'Chicago', position: 'Junior Dev' },
{ name: 'John', city: 'Chicago', position: 'Middle Dev' },
{ name: 'David', city: 'Chicago', position: 'Team Lead' }
];
var temp_array = [
{ name: 'Alex', city: 'Chicago', position: 'Junior Dev' },
{ name: 'John', city: 'Chicago', position: 'Middle Dev' },
{ name: 'Ben', city: 'Chicago', position: 'Senior Dev' },
{ name: 'David', city: 'Chicago', position: 'Team Lead' }
];
function createLookup(input) {
var result = {};
for(var i = 0; i < input.length; i++) {
var current = result;
for(var key in input[i]) {
if (!current[input[i][key]])
current[input[i][key]] = {};
current = current[input[i][key]];
}
}
return result;
}
function existsInLookup(item, lookup) {
var current = lookup;
for (var key in item) {
//console.log(key);
//console.log(current[item[key]]);
if (!current[item[key]])
return false;
current = current[item[key]];
}
return true;
}
var lookup = createLookup(array);
//console.log(lookup);
for (var i = 0; i < temp_array.length; i++) {
var exists = existsInLookup(temp_array[i], lookup);
console.log(exists);
if (!exists) {
array.push(temp_array[i]);
console.log(temp_array[i]);
}
}
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости