お早う,盆友们。
有的时候可能我们需要去进行一些对象(object)的判断。
var obj1 = { a: 1 }
var obj2 = { a: 1 }
console.log(obj1 === obj2); // false
如上,在长度、内容相等时,我们去判断,依然不会像等,这是关于堆的问题,两个对象不在同一个堆中时,即使我们看着值是相等的,但是我们获取到的判断依然不会是true。
但是如果我们需要判断的对象更长,在不知道他的键的时候,该如何判断一个对象是否包含一个对象时,这又是一个问题。
var obj1 = { a: 1, b: 2, c: 3 }
var obj2 = { a: 1 }
如上,在两个对象未知时,我们如何去判断obj1包含obj2
var obj1 = { a: 1, b: 2, c: 3 }
var obj2 = { a: 1 }
function contains(a, b) {
var contains = true
for (const key in b) {
if (a[key] != b[key]) {
return false
}
}
return contains
}
console.log(contains1(obj1, obj2));
我们可以用for …in…循环去遍历判断判断obj1是否包含obj2对象属性的同时去判断它的值是否相等
这么写有用吗,有用
但是这么写好看吗?
NO ~ ~ ~
我们对它进行一些更改
var obj1 = { a: 1, b: 2, c: 3 }
var obj2 = { a: 1 }
let contains = (a, b) => Object.entries(b).every(([k, v]) => {
return a[k] === v
})
console.log(contains(obj1, obj2))
上面代码是不是就变得更加的优雅了
Object.entries(对象) 将判断是否被包含的对象的键值对转换成数组形式,然后遍历和包含的对象进行判断,再因为every的特性,就可以得到 对象是否包含另一个对象的判断。
当然还可以再简写一点
let contains = (a, b) => Object.entries(b).every(([k, v]) => a[k] === v)
只需要return返回出去,那么大括号和return就可以简写了,没有大括号会默认return你所写的判断。
搞定,撤退!