码迷,mamicode.com
首页 > 编程语言 > 详细

JavaScript中对象的比较

时间:2019-04-27 00:14:24      阅读:140      评论:0      收藏:0      [点我收藏+]

标签:receive   name   方法   names   asc   symbol   javascrip   组成   mes   

问题描述:  

  在JavaScript中,数值的比较是比较简单的,使用相等(==)和全等(===)符号基本上可以解决大多数非对象的比较;但是相等(==)和全等(===)符号在对象 object 的比较上,就不能满足所有的要求了,如下面的代码:

 1 let obj_a = {
 2 name: "jack",
 3     old: 12
 4 }
 5 
 6 let obj_b = {
 7     name: "lucy",
 8     old: 13
 9 }
10 
11 let obj_c = {
12     name: "lucy",
13     old: 13
14 }
15 
16 let obj_d = obj_b
17 
18 console.log(obj_a === obj_b) // false
19 console.log(obj_b === obj_c) // false
20 console.log(obj_b === obj_d) // true

  上面代码中 obj_b 和 obj_c 是不等的,但是和 obj_d 是相等的,这是因为全等符号 === 在比较对象的时候,比较的是对象的地址,换句话来说:全等符号判断的是两个对象是否是一个对象,而不能判断两个对象是否数值相等,事实上,在大多数情况下,使用全等符号去判断两个对象返回的均是 false

解决方法:

  那如果需要判断两个对象在字面意义上是否相等,该才去什么样的操作?答案是遍历两个对象,然后在一一比较 key-value 对;为了方便使用,可以将比较的方法抽象成为下面的函数:

 1 // 判断对象相等(数值表现)的函数
 2 // 如果 a, b相等,则返回 true,否则返回 false
 3 const isObjectValueEqual = (a, b) => {
 4     // Object.getOwnPropertyNames()方法返回一个由指定对象的所有自身属性的属性名(包括不可枚举属性但不包括Symbol值作为名称的属性)组成的数组
 5     // 换句话来说 Object.getOwnPropertyNames()方法返回的是对象所有 key 组成的数组 list
 6     var aProps = Object.getOwnPropertyNames(a);
 7     var bProps = Object.getOwnPropertyNames(b);
 8     if (aProps.length != bProps.length) {
 9         return false;
10     }
11 
12     for (var i = 0; i < aProps.length; i++) {
13         var propName = aProps[i];
14         if (a[propName] !== b[propName]) {
15             return false;
16         }
17     }
18     return true;
19 }
20 
21 // 判断一个对象是否存在于数组(该数组由对象所组成)中的函数
22 // 如果 obj 对象存在于 list 数组中,则返回 true,否则返回 false
23 const isObjectListValueEqual = (list, obj) => {
24     for (let i = 0, len = list.length; i < len; i++) {
25         if (isObjectValueEqual(list[i], obj)) {
26             return true
27         }
28     }
29     return false
30 }
31 
32 // 判断一个数组(该数组由对象所组成)中每个对象是否是不重复的(值)
33 // 如果 list 数组中没有重复的对象,则返回 true,否则返回 false
34 const isJudgeObjectListValueSingle = (list) => {
35     let receive = list
36     for (let i = 0, len = receive.length; i < len; i++) {
37         let temp = receive[i]
38         let aim = receive.slice(i + 1, len)
39         if (isObjectListValueEqual(aim, temp)) {
40             return false
41         }
42     }
43     return true
44 }

 

结论:

  1)===主要用于判断对象是否是同一个对象,而不能用来判断两个存储地址不一致的对象在属性上是否完全相等

  2)判断存储地址不一致的对象在属性上是否完全相等可以使用如上函数

  3)普通变量可以使用 set 集合的方法方便地去重,但是对象变量是不能的(这点可以自己验证)

  

JavaScript中对象的比较

标签:receive   name   方法   names   asc   symbol   javascrip   组成   mes   

原文地址:https://www.cnblogs.com/oulae/p/10777117.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!