JS功能“深度比较”。对象比较 [英] JS function "Deep comparison". Object comparison
本文介绍了JS功能“深度比较”。对象比较的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我想实现JS函数深度比较并遇到一个有趣的功能。
第一种情况-
< pre class = snippet-code-js lang-js prettyprint-override>
var arrValuesObjA = [{is: an},2]; var arrValuesObjB = [{is: an}, 2]; console.log(Array.isArray(arrValuesObjA),arrValuesObjA); // true Array [{…},2] // 0:对象{是: an} 1:2长度:2console.log(Array .isArray(arrValuesObjB),arrValuesObjB); // true数组[{…},2] // 0:对象{是: an} 1:2长度:2for(让i = 0; i< arrValuesObjA.length ; i ++){console.log(arrValuesObjA [i] === arrValuesObjB [i]);; //第一次迭代-false,第二次迭代-true。 //表示arrValuesObjA [0]中的对象{是: an}不等于arrValuesObjB [0]中的对象{是: an} !!!}
但是请看第二种情况。
第二种情况-
let objA = {此处:{is: an},对象:2},objB = {此处:{是:一个},对象:2}; var arrKeysObjA = Object.keys(objA); var arrKeysObjB = Object.keys(objB); var arrValuesObjA = []; var arrValuesObjB = []; for(让i = 0; i< arrKeysObjA.length; i ++){arrValuesObjA.push(objA [arrKeysObjA [i]]));} for(让i = 0; i< arrKeysObjB.length; i ++ ){arrValuesObjB.push(objA [arrKeysObjB [i]]);} console.log(Array.isArray(arrValuesObjA),arrValuesObjA); // true Array [{…},2] // 0:对象{是: an} 1:2长度:2 //与第一种情况相同!console.log(Array.isArray(arrValuesObjB),arrValu esObjB); // true数组[{…},2] // 0:对象{是: an} 1:2长度:2 //与第一种情况相同!for(let i = 0;我< arrKeysObjA.length; i ++){console.log(arrValuesObjA [i] === arrValuesObjB [i]); //第一次迭代-true !!!,第二次迭代-true。 //表示arrValuesObjA [0]中的对象{是: an}等于arrValuesObjB [0]中的对象{是: an}}
在第一种情况下,来自arrValuesObjA [0]的对象{是: an}不等于对象{是: an }来自arrValuesObjB [0],但在第二种情况下它们是相等的。
有人可以解释这是怎么回事吗?
我认为它与按值复制和按引用复制有关,但我不确定。
解决方案
for(让i = 0; i< arrKeysObjA.length; i ++){
arrValuesObjA.push(objA [arrKeysObjA [i]]);;
}
for(let i = 0; i< arrKeysObjB.length; i ++){
arrValuesObjB.push(objA [arrKeysObjB [i]]);;
}
在上述两种情况下,请仔细使用 objA
。
I wanted to implement JS function "Deep comparison" and encounter on one interesting feature.
1st case -
var arrValuesObjA = [{is: "an"}, 2];
var arrValuesObjB = [{is: "an"}, 2];
console.log(Array.isArray(arrValuesObjA), arrValuesObjA);
//true Array [ {…}, 2 ] // 0: Object { is: "an" } 1: 2 length: 2
console.log(Array.isArray(arrValuesObjB), arrValuesObjB);
// true Array [ {…}, 2 ] // 0: Object { is: "an" } 1: 2 length: 2
for (let i = 0; i < arrValuesObjA.length; i++) {
console.log(arrValuesObjA[i] === arrValuesObjB[i]);
// First iteration - false, second iteration - true.
// Means Object { is: "an" } from arrValuesObjA[0] don't equal to Object { is: "an" } from arrValuesObjB[0] !!!
}
But look into the 2nd case.
2nd case -
let objA = {here: {is: "an"}, object: 2}, objB = {here: {is: "an"}, object: 2};
var arrKeysObjA = Object.keys(objA);
var arrKeysObjB = Object.keys(objB);
var arrValuesObjA = [];
var arrValuesObjB = [];
for (let i = 0; i < arrKeysObjA.length; i++) {
arrValuesObjA.push(objA[arrKeysObjA[i]]);
}
for (let i = 0; i < arrKeysObjB.length; i++) {
arrValuesObjB.push(objA[arrKeysObjB[i]]);
}
console.log(Array.isArray(arrValuesObjA), arrValuesObjA);
// true Array [ {…}, 2 ] // 0: Object { is: "an" } 1: 2 length: 2 // the same as in 1st case!
console.log(Array.isArray(arrValuesObjB), arrValuesObjB);
// true Array [ {…}, 2 ] // 0: Object { is: "an" } 1: 2 length: 2 // the same as in 1st case!
for (let i = 0; i < arrKeysObjA.length; i++) {
console.log(arrValuesObjA[i] === arrValuesObjB[i]);
// First iteration - true!!!, second iteration - true.
// Means Object { is: "an" } from arrValuesObjA[0] equal to Object { is: "an" } from arrValuesObjB[0] !!!
}
In 1st case Object { is: "an" } from arrValuesObjA[0] don't equal to Object { is: "an" } from arrValuesObjB[0] but in the 2nd case they are equal.
Can anyone explain what's going on? I think it somehow related with copy by value and copy by reference but i'm not sure.
解决方案
for (let i = 0; i < arrKeysObjA.length; i++) {
arrValuesObjA.push(objA[arrKeysObjA[i]]);
}
for (let i = 0; i < arrKeysObjB.length; i++) {
arrValuesObjB.push(objA[arrKeysObjB[i]]);
}
Look carefully in both cases above you are using objA
.
这篇关于JS功能“深度比较”。对象比较的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文