Javascript 如何递归地检查对象的动态集合是否具有相同的键?
我得到了一个具有动态属性的对象,但其所有属性值也是对象(此级别的关键点可以不同,这很好)。但对于这些对象中的每一个,我希望确保它们都具有相同的键,并且也是递归的。比如说 给定一个位置Javascript 如何递归地检查对象的动态集合是否具有相同的键?,javascript,recursion,Javascript,Recursion,我得到了一个具有动态属性的对象,但其所有属性值也是对象(此级别的关键点可以不同,这很好)。但对于这些对象中的每一个,我希望确保它们都具有相同的键,并且也是递归的。比如说 给定一个位置 A = { 'en' : { 's1' : '', 's2' : { 's3' : '', 's4' : '' } }, 'fr' : { 's1' : '', '
A = {
'en' : {
's1' : '',
's2' : {
's3' : '',
's4' : ''
}
},
'fr' : {
's1' : '',
's2' : {
's3' : '',
's4' : ''
}
}
}
这两者是相同的,因为它们递归地具有相同的键值
A = {
'en' : {
's1' : '',
's2' : {
's3' : '',
's4' : ''
}
},
'fr' : {
's1' : '',
's2' : {
's3' : '',
's5' : ''
}
}
}
这将是错误的,因为s5是不同的,并且至少在另一个中不存在
本质上,目的是创建一个包含语言对象的对象,我可以放置任何我想要的语言对象,所以它是动态的。但是对于每个语言对象,它的所有键都应该同步,并且与所有其他语言对象相同
我有这个
this.compareKeys = function(dataObj) {
var checkObj = {};
for(var prop in dataObj) {
if (dataObj.hasOwnProperty(prop)) {
var obj = dataObj[prop];
var keysStr = JSON.stringify(Object.keys(obj).sort());
var keys = Object.keys(checkObj);
if (keys.length == 0) {
checkObj[keysStr] = true;
} else if (!checkObj.hasOwnProperty(keysStr)) {
return false;
}
}
}
return true;
}
但是我如何使它递归地工作呢?这只检查1级深度
谢谢您可以将lang对象与结构对象进行比较:
var struct = {
's1' : '',
's2' : {
's3' : '',
's4' : ''
}
}
var lang = {
'en' : {
's1' : '',
's2' : {
's3' : '',
's4' : ''
}
},
'fr' : {
's1' : '',
's2' : {
's3' : '',
's4' : ''
}
}
}
因此,递归地获取lang对象中的所有键:
function getAllKeys(obj, res) { // Get all keys in string format
for(k in obj) {
res.push(k);
if(typeof(obj[k]) === "object") {
var o = obj[k];
getAllKeys(o, res);
}
}
return res.join("");
}
将对象和结果数组作为参数提供给此函数:
function f(obj, []) { ... }
检查该值是否为对象:
if(typeof(obj[k]) === "object") { ... }
如果是这样,请使用obj[k]
作为新对象再次运行该函数,依此类推
出于比较的原因,函数输出一个字符串
下一步是将lang对象与structure对象进行比较:
function compareObjWithStructure(obj, struct) {
var s = getAllKeys(struct, []);
for(k in obj) {
var ks = getAllKeys(obj[k], []);
if(ks !== s) {
return false;
} else {
return true;
}
}
}
您可以使用传递键数组逐级比较两个对象
if (obj1.constructor === Array && obj2.constructor === Array) {
flag = obj1.length === obj2.length;
if (flag) {
obj1.forEach(function(key) {
map[key] = (map[key] || 0) + 1;
});
obj2.forEach(function(key) {
flag = flag && (map[key] !== undefined);
});
}
return flag;
}
如果此级别的关键点相同,则检查其子项
Object.keys(obj1).forEach(function(key) {
if (typeof obj1[key] === 'object') {
flag = flag && compareKeys(obj1[key], obj2[key]);
}
});
这是你的电话号码
希望这是有用的。对不起,我编辑了一些示例,有点输入错误。