Я пытаюсь создать функцию, которая будет проводить глубокое сравнение двух объектов JSON (objectA и objectB).А затем сгенерируйте уникальный объект JSON, который имеет только дерево узлов с различными значениями данных.
Моя идея состояла в том, чтобы отправить части JSON в рекурсивную функцию в сочетании с массивом, который содержит путь данных.Но когда я запускаю код в том виде, в котором он написан, я получаю дополнительные элементы в моем массиве путей.
Конечный результат в идеале должен обеспечить путь, подобный следующему:[ "level1c", "level2b", "level3c" ]
но к сожалению я получаю:[ "level1a", "level1b", "level1c", "level2b", "level3c" ]
Когда-то у меня был твердый путь к данным, а затем я собирался взять его, чтобы построить новый объект JSON, который только включает в себя отличающиеся узлы.
function compareJSON( primary, secondary ){
function diffJSON( primary, secondary, path ){
var p = path.slice(); // copy array
var keys = Object.keys( secondary );
var sVal;
var pVal;
for( var i=0, x=keys.length; i<x; i++ ){
sVal = secondary[keys[i]];
pVal = primary[keys[i]];
if( sVal !== pVal ){
p.push( keys[i] );
if( typeof sVal === 'object' && !Array.isArray( sVal ) ){
diffJSON( pVal, sVal, p );
}else{
if( Array.isArray( sVal ) ){
compareArray( sVal, pVal, p );
}else{
updateResult( sVal, p );
}// END if( !Array.isArray() )
}// END if( typeof sVal === 'object' ... )
}// END if( sVal !== pVal )
}// END for loop
function compareArray( arr, arr2, path ){
// compare arrays
}
function updateResult( data, path ){
console.log( data, path );
}// END function updateResult()
}// END function diffJSON()
diffJSON( primary, secondary, [] );
}// END function compareJSON()
Дополнительная информация:
- Я знаю, что objectA и objectB имеют одинаковую структуру;где objectB будет когда-либо только модификацией данных в objectA.
- В поисках решения, не соответствующего ES6 (старое удовольствие от поддержки браузера).
- Основной вопрос заключается в том, как мне получить правопуть узла к разным данным;любые советы / хитрости / комментарии о том, как улучшить основной код, приветствуются, но на самом деле это не ответ.
На практике этот код выводит в консоль значение, которое, как оказалось, отличаетсяjson2 (по сравнению с json1) и связанный массив путей:
'use strict';
function compareJSON( primary, secondary ){
function diffJSON( primary, secondary, path ){
var p = path.slice(); // copy array
var keys = Object.keys( secondary );
var sVal;
var pVal;
for( var i=0, x=keys.length; i<x; i++ ){
sVal = secondary[keys[i]];
pVal = primary[keys[i]];
if( sVal !== pVal ){
p.push( keys[i] );
if( typeof sVal === 'object' && !Array.isArray( sVal ) ){
diffJSON( pVal, sVal, p );
}else{
if( Array.isArray( sVal ) ){
compareArray( sVal, pVal, p );
}else{
updateResult( sVal, p );
}// END if( !Array.isArray() )
}// END if( typeof sVal === 'object' ... )
}// END if( sVal !== pVal )
}// END for loop
function compareArray( arr, arr2, path ){
var match = true;
for( var i=0, x=arr.length; i<x; i++ ){
if( arr[i] !== arr2[i] ){
match = false;
}
}
if( !match ){
updateResult( arr, path );
}
}
function updateResult( data, path ){
console.log( data, path );
}// END function updateResult()
}// END function diffJSON()
diffJSON( primary, secondary, [] );
}// END function compareJSON()
var json1 = {
level1a : {
level2a : {
level3a : 'apple',
level3b : ['happy', 'happy', 'joy', 'joy'],
level3c : {
level4a : 'sleep'
},
level3d : true
},
level2b : 'music',
level2c : {
level3a : 'future',
level3b : false,
level3c : ['bear', 'camel', 'elephant']
}
},
level1b : {
level2a : 'jeopardy',
level2b : 10200,
level2c : true,
level2d : {
level3a : 'aliens',
level3b : 'weekend'
}
},
level1c : {
level2a : 'fiber',
level2b : [1, 2, 4, 5, 6]
},
level1d : ['apple', 'cat', 'baby'],
level1e : true,
level1f : {
level2a : false,
level2b : true,
level2c : {
level3a : 'naruto',
level3b : 123,
level3c : 'test',
level3d : 'this',
level3e : 'thing'
},
level2d : true
}
};
var json2 = {
level1a : {
level2a : {
level3a : 'apple',
level3b : ['happy', 'happy', 'joy', 'joy'],
level3c : {
level4a : 'sleep'
},
level3d : true
},
level2b : 'music',
level2c : {
level3a : 'future',
level3b : false,
level3c : ['bear', 'camel', 'elephant', 'lion']
}
},
level1b : {
level2a : 'jeopardy',
level2b : 10200,
level2c : true,
level2d : {
level3a : 'ancient',
level3b : 'weekend'
}
},
level1c : {
level2a : 'fiber',
level2b : [1, 2, 4, 5, 6]
},
level1d : ['apple', 'cat', 'baby'],
level1e : true,
level1f : {
level2a : false,
level2b : true,
level2c : {
level3a : 'naruto',
level3b : 123,
level3c : 'spicy',
level3d : 'this',
level3e : 'thing'
},
level2d : true
}
};
compareJSON( json1, json2 );
Спасибо за ваше время и поддержку :)