JS功能“深度比较”。对象比较 [英] JS function "Deep comparison". Object comparison

查看:77
本文介绍了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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆