1. 程式人生 > 其它 >js怎麼判斷兩個物件相等?

js怎麼判斷兩個物件相等?

ES6 中有一個方法判斷兩個物件是否相等,這個方法判斷是兩個物件引用地址是否一致

let obj1= {
	a: 1
}
let obj2 = {
	a: 1
}
console.log(Object.is(obj1, obj2)) // false
let obj3 = obj1
console.log(Object.is(obj1, obj3)) // true
console.log(Object.is(obj2, obj3)) // fals

當需求是比較兩個物件內容是否一致時就沒用了
想要比較兩個物件內容是否一致,思路是要遍歷物件的所有鍵名和鍵值是否都一致:
1、判斷兩個物件是否指向同一記憶體
2、使用 Object.getOwnPropertyNames 獲取物件所有鍵名陣列
3、判斷兩個物件的鍵名陣列是否相等
4、遍歷鍵名,判斷鍵值是否都相等

let obj1 = {
	a: 1,
	b: {c: 2}
}
let obj2 = {
	b: {c: 3},
	a: 1
}
function isObjectValueEqual(a, b) {
	// 判斷兩個物件是否指向同一記憶體,指向同一記憶體返回 true
	if (a === b) return true // 獲取兩個物件鍵值陣列
	let aProps = Object.getOwnPropertyNames(a)
	let bProps = Object.getOwnPropertyNames(b)
	// 判斷兩個物件鍵值陣列長度是否一致,不一致返回 false
	if (aProps.length !== bProps.length) return false // 遍歷物件的鍵值
	for (let prop in a) {
		// 判斷 a 的鍵值,在 b 中是否存在,不存在,返回 false
		if (b.hasOwnProperty(prop)) {
		// 判斷 a 的鍵值是否為物件,是則遞迴,不是物件直接判斷鍵值是否相等,不相等返回 false
			if (typeof a[prop] === 'object') {
				if (!isObjectValueEqual(a[prop], b[prop])) return false
			} else if (a[prop] !== b[prop]) {
				return false
			}
		} else {
			return false
		}
	}
	return true
}
console.log(isObjectValueEqual(obj1, obj2)) // false