问题类似于:How can I check that two objects have the same set of property names?但只有一个区别
我想检查一下:
var objOne = {"a":"one","b":"two","c":{"f":"three_one"}};
var objTwo = {"a":"four","b":"five","c":{"f":"six_one"}};
在所有级别中具有相同的键集?
例如,deepCheckObjKeys(objOne, objTwo)
将返回true
,其中deepCheckObjKeys(objOne, objThree)
返回false
,如果:
var objThree = {"a":"four","b":"five","c":{"g":"six_one"}};
由于objThree中的objThree.a.c.f
是undefined
。
类似这样的函数:
'use strict';
function objectsHaveSameKeys() {
for (var _len = arguments.length, objects = Array(_len), _key = 0; _key < _len; _key++) {
objects[_key] = arguments[_key];
}
var allKeys = objects.reduce(function (keys, object) {
return keys.concat(Object.keys(object));
}, []);
var union = new Set(allKeys);
return objects.every(function (object) {
return union.size === Object.keys(object).length;
});
}
只检查第一级。
PS:objectsHaveSameKeys()ES6等价:
function objectsHaveSameKeys(...objects):boolean {
const allKeys = objects.reduce((keys, object) => keys.concat(Object.keys(object)), []);
const union = new Set(allKeys);
return objects.every(object => union.size === Object.keys(object).length);
}
4条答案
按热度按时间e3bfsja21#
如果属性的值是一个对象,我会做一个递归检查。
这里有个有趣的问题实际上,至少有两个:
null
,而另一个没有属性,该怎么办?true
还是false
?{a: null}
,而另一个对象有{a: 17}
,会怎么样?true
还是false
?{a: null}
,而另一个对象有{a: {}}
,会怎么样?true
还是false
?在这个例子中,我把
null
当作一个没有属性的对象,但是它非常依赖于你的用例。我可以想到至少两种其他方法(null
不匹配除了null
之外的任何东西,或者null
不匹配除了非对象之外的任何东西,即使对象没有自己的属性),并且可能还有其他方法。见评论:
anauzrmj2#
我猜你正在寻找[这里]提供的函数的深度检查版本:)(How can I check that two objects have the same set of property names?)。
下面是我的尝试。请注意:
lvmkulzt3#
您可以创建递归函数,该函数将返回所有键并检查它们是否与
every()
相等。jgwigjjp4#
此函数只检查键,并将深入检查,直到找到不匹配的内容。
用TypeScript写的:
}