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]);
  }
});
这是你的电话号码


希望这是有用的。

对不起,我编辑了一些示例,有点输入错误。