这个问题类似于:如何检查两个对象是否具有相同的属性名称集合?,但只有一个区别
我想要检查:
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);
}
{ foo: [1, 2] }
和{ foo: [] }
视为具有相同的键,但是上面的代码将返回false
,因为数组具有不同的键(这是正确的,但并不真正相关)。 - jdunningdeepSameKeys({ a: null }, { a: 17 })
和deepSameKeys({ a: '1' }, { a: 1 })
都返回false
。 - fservantdevreturn false
不行,好的发现,我已经更新了。 - T.J. Crowder