繁体   English   中英

如何比较嵌套 object / 数组结构中的特定键值?

[英]How does one compare specific key-values within a nested object / array structure?

我有两个 arrays 如下

array1 = {name:"John",surname:"doe",reference:[{name:"jane",surname:"smith",array:[{name:"test",surname:"test",position:12}]},{name:"kate",surname:"post",array:[{name:"test",surname:"test",position:12}]}],id:"12364",weight:"50",Oid:"456978",code:"12"}

array2 =  {name:"John",surname:"doe",reference:[{name:"jane",surname:"smith,array:[{name:"test",surname:"test",position:12}]"},{name:"kate",surname:"post",array:[{name:"test",surname:"test",position:12}]}],id:"4589632",weight:50,policy:"745896",result:"test",documents:"no",launch:"no"}

正如你所看到的,我的 arrays 的长度都不匹配,所以我无法比较它们。

我只想比较数组 1 和数组 2 中的某些对象。例如,只比较我需要的对象

array1
name:"John"
surname:"doe"
reference:[{name:"jane",surname:"smith",array:[{name:"test",surname:"test",position:12}]},{name:"kate",surname:"post",array:[{name:"test",surname:"test",position:12}]}]
weight:"50"

array 2
name:"John"
surname:"doe"
reference:[{name:"jane",surname:"smith",array:[{name:"test",surname:"test",position:12}]},{name:"kate",surname:"post",array:[{name:"test",surname:"test",position:12}]}]
weight:50

我只想比较上面的对象键值,所以上面会返回 true

如果我有

 array1
    name:"John"
    surname:"doe"
    reference:[{name:"jane",surname:"smith",array:[{name:"test",surname:"test",position:12}]},{name:"kate",surname:"post",array:[{name:"test",surname:"test",position:12}]}]
    weight:"12"

array 2
name:"John"
surname:"Petter"
reference:[{name:"jane",surname:"smith",array:[{name:"test",surname:"t2",position:12}]},{name:"kate",surname:"Knight",array:[{name:"test",surname:"test",position:14}]}]
weight:50

以上将是错误的。

我怎样才能做到这一点? 我如何过滤/循环它们以仅比较上述值。

您可以创建一个 function 来进行检查。


笔记:

  • 我们使用==进行比较,因为在您的示例中weight: 50等于weight: '50' (字符串和数字)。
  • function 还使用相同的键来比较内部数组reference进行比较。

 function compareObjects(obj1, obj2, keysToCompare) { return keysToCompare.every(x => obj1[x] instanceof Array? obj1[x].every((y, yi) => compareObjects(y, obj2[x][yi], Object.keys(y))): obj1[x] == obj2[x]); } // Nothing is different - should work console.log(compareObjects({ name: 'John', surname: 'doe', reference: [{ name: 'jane', surname: 'smith', }, { name: 'kate', surname: 'post' }, ], id: '12364', weight: '50', Oid: '456978', code: '12', }, { name: 'John', surname: 'doe', reference: [{ name: 'jane', surname: 'smith', }, { name: 'kate', surname: 'post', }], id: '4589632', weight: 50, policy: '745896', result: 'test', documents: 'no', launch: 'no', }, [ 'name', 'surname', 'reference', 'weight', ])); // One key is different - should fail console.log(compareObjects({ name: 'John', surname: 'doe', reference: [{ name: 'jane', surname: 'smith', }, { name: 'kate', surname: 'post', }], id: '12364', weight: '50', Oid: '456978', code: '12', }, { name: 'John', // This value is different surname: 'FOOL', reference: [{ name: 'jane', surname: 'smith', }, { name: 'kate', surname: 'post', }], id: '4589632', weight: 50, policy: '745896', result: 'test', documents: 'no', launch: 'no', }, [ 'name', 'surname', 'reference', 'weight', ])); // One key is different - should fail console.log(compareObjects({ name: 'John', surname: 'doe', reference: [{ name: 'jane', surname: 'smith', }, { name: 'kate', surname: 'post', }], id: '12364', weight: '50', Oid: '456978', code: '12', }, { name: 'John', surname: 'doe', reference: [{ name: 'jane', // This value is different surname: 'FOOL', }, { name: 'kate', surname: 'post', }], id: '4589632', weight: 50, policy: '745896', result: 'test', documents: 'no', launch: 'no', }, [ 'name', 'surname', 'reference', 'weight', ])); // Position is different - should work console.log(compareObjects({ name: 'John', surname: 'doe', reference: [{ name: 'jane', surname: 'smith', position: 10, }, { name: 'kate', surname: 'post', position: 10, }, ], id: '12364', weight: '50', Oid: '456978', code: '12', }, { name: 'John', surname: 'doe', reference: [{ name: 'jane', surname: 'smith', position: 10, }, { name: 'kate', surname: 'post', position: 15, }], id: '4589632', weight: 50, policy: '745896', result: 'test', documents: 'no', launch: 'no', }, [ 'name', 'surname', 'reference', 'weight', ])); // Everything is same - should work (including position) console.log(compareObjects({ name: 'John', surname: 'doe', reference: [{ name: 'jane', surname: 'smith', position: 10, }, { name: 'kate', surname: 'post', position: 10, }, ], id: '12364', weight: '50', Oid: '456978', code: '12', }, { name: 'John', surname: 'doe', reference: [{ name: 'jane', surname: 'smith', position: 10, }, { name: 'kate', surname: 'post', position: 10, }], id: '4589632', weight: 50, policy: '745896', result: 'test', documents: 'no', launch: 'no', }, [ 'name', 'surname', 'reference', 'weight', ]));

对于给定的场景/示例,一种可靠甚至推荐的方法是提供自定义stringify function 统一/规范化任何提供的 object 结构(它们可能在对象之间有所不同)并且还清理任何对象的值类型(例如,在object 示例由 OP 提供),然后返回一个字符串代表此非常 object。

以这种方式处理的对象可以安全地相互比较......

 const objA = { name: "John", surname: "doe", reference: [{ name: "jane", surname: "smith", array: [ { position: 12, surname: "test", name: "test" } ] }, { name: "kate", surname:"post", array:[ { name: "test", surname: "test", position: 12 } ] }], id: "12364", weight: "50", Oid: "456978", code: "12", }; const objB = { reference: [{ surname:"post", name: "kate", array:[ { name: "test", surname: "test", position: 12 } ] }, { array: [ { name: "test", surname: "test", position: 12 } ], name: "jane", surname: "smith", }], surname: "doe", name: "John", id: "4589632", weight: 50, policy: "745896", result: "test", documents: "no", launch: "no", }; const objC = { name: "John", surname: "doe", reference: [{ name: "jane", surname: "smith", array: [ { position: 12, surname: "test", name: "test" } ]}, { name: "kate", surname:"post", array:[ { name: "test", surname: "test", position: 12 } ] }], weight: "60", }; const objD = { name: "John", surname: "doe", reference: [{ name: "jane", surname: "smith", array: [ { position: 12, surname: "test", name: "test" } ]}, { name: "kate", surname:"post", array:[ { name: "test", surname:"test", position: 24 } ] }], weight: "60", }; const orderByName = (a, b) => a.surname.localeCompare(b.surname) || a.name.localeCompare(b.name); function normalizeItemReference(arr) { return arr // assure a certain order. .sort(orderByName) // assure identical structure. .map(({ name, surname, array }) => ({ name, surname, array: array // assure a certain order. .sort(orderByName) // assure identical structure and value type. .map(({ name, surname, position }) => ({ name, surname, position: Number(position) }) ) }) ); } function stringifyItem(obj) { const { name, surname, weight, reference } = obj; return JSON.stringify({ // assure identical structure and value types. name, surname, weight: Number(weight), reference: normalizeItemReference(reference) }); } console.log( '(stringifyItem(objA) === stringifyItem(objB))?', (stringifyItem(objA) === stringifyItem(objB)) ); console.log( '(stringifyItem(objA) === stringifyItem(objC))?', (stringifyItem(objA) === stringifyItem(objC)) ); console.log( '(stringifyItem(objC) === stringifyItem(objD))?', (stringifyItem(objC) === stringifyItem(objD)) ); console.log( 'stringifyItem(objA)...', stringifyItem(objA) ); console.log( 'stringifyItem(objB)...', stringifyItem(objB) ); console.log( 'stringifyItem(objC)...', stringifyItem(objC) ); console.log( 'stringifyItem(objD)...', stringifyItem(objD) );
 .as-console-wrapper { min-height: 100%;important: top; 0; }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM