【问题标题】:JS function "Deep comparison". Object comparison [closed]JS函数“深度比较”。对象比较[关闭]
【发布时间】:2018-02-12 15:16:08
【问题描述】:

我想实现JS功能“深度比较”并遇到一个有趣的功能。

第一种情况 -

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] !!!
}

但是看看第二种情况。

第二种情况 -

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] !!!
}

在第一种情况下 Object { is: "an" } from arrValuesObjA[0] 不等于 Object { is: "an" } from arrValuesObjB[0] 但在第二种情况下它们是相等的。

谁能解释发生了什么? 我认为它与按值复制和按引用复制有某种关系,但我不确定。

【问题讨论】:

  • 解决了!这是错字。 Thaks Giorgi Moniava!
  • 仅供参考,您可以使用Object.values 方法。 var arrValuesObjA = Object.values(objA);
  • 这是一项实验性技术(Object.values),并非所有浏览器都支持。 @钟表
  • 这不是实验性的;这是一个完全标准化的功能。至于浏览器支持,它可以是 polyfill,但这取决于你。您可以改用.map(),它仍然比循环更干净。 var arrValuesObjA = Object.keys(objA).map(k =&gt; objA[k]); 如果您支持的浏览器列表无法处理,可以将箭头函数替换为 function 语法。

标签: javascript comparison deepequals


【解决方案1】:
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]]);
}

仔细查看上述两种情况,您使用的是objA

【讨论】:

    猜你喜欢
    • 2018-02-28
    • 1970-01-01
    • 2021-12-31
    • 2012-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多