使用两个for循环迭代对象vs if (k in obj)



我需要遍历两个对象并检查它们的键是否匹配。关键是,我需要确保两个键都是小写的。我已经在这里发布过了。

这很容易做到,如果我只是循环遍历两个对象并检查匹配。但这意味着,在最坏的情况下,我可以运行到每个对象的最后一个键。

我在上面放了一个计数器,结果有很多支票:

var i = 0;
for (key in objA) {
    for (key2 in objB) {
    i++; //ends up at 185 checks
    if (key.toLowerCase() === key2.toLowerCase()) {
          console.log('match');

我不确定if (k in..)语法有什么性能差异,因为我不能迭代内部循环。

for (key in objA) {
     if (key in objB) {
     //i = ?

两者之间的性能差异是什么?

注意:对象的长度不匹配。基本上,我传入了一个较小的对象,它带有键,我需要与较大的对象进行检查。为了我的项目的目的,我需要检查小对象中的任何键是否在大对象中。


我使用开始和结束之间的日期时间差检查。

var start = (new Date).getTime();
//loop
var diff = (new Date).getTime() - start;

循环1:4秒

循环2:1秒

问题是,我需要一些方法来有效地检查两个小写键从不同大小的对象使用更有效的if (k in obj)检查。

首先,您可能想要检查两个对象是否具有相同数量的键:

Object.keys(objA).length === Object.keys(objB).length;

如果这两个长度不匹配,则对象没有相同的键。

现在,如果这些长度确实匹配,您可以使用第二个代码片段来比较键,这意味着您只需要迭代n键,而不是像在第一个代码片段中那样迭代n * n键。

请记住,这些检查是区分大小写的。

应该这样做:

function checkKeys(objA, objB){
    if(Object.keys(objA).length !== Object.keys(objB).length)
        return false;
    for (key in objA) {
        if (!(key in objB))
            return false;
    }
    return true;
};
alert(checkKeys({}, {}));
alert(checkKeys({}, {a: 1}));
alert(checkKeys({a: 1}, {a: 1}));
alert(checkKeys({a: 1}, {A: 1}));
alert(checkKeys({a: 1}, {a: 1, b: 2}));

如何检查他们是否有hasOwnProperty属性?

for (key in objA) {
    if (objB.hasOwnProperty(key)))
        console.log("HAS the property/key, do something");
    }
    else {
        console.log("Doesn't have the property/key, do something");    
    }
}

如果只有一个小写键

,最简单的检查小写的方法
key = key.toLowerCase(); // before the objB check

或者在此操作之前,您可以在此检查之前将其转换为小写,就像Jack一样:

var key, keys = Object.keys(obj);
var n = keys.length;
var newobj={}
while (n--) {
    key = keys[n];
    newobj[key.toLowerCase()] = obj[key];
}

把一个对象的所有键都变成小写的最好(最有效)的方法是什么?

如果一个对象相当大,您可以先转换该对象的键,然后针对它测试较小的对象:

function test(big, small)
{
  // lowercase all keys in the bigger object
  var map = {};
  for (var bk in big) {
    map[bk.toLowerCase()] = true;
  }
  // test all keys in smaller object against map
  for (var sk in small) {
    if (!(sk.toLowerCase() in map)) {
      return false;
    }
  }
  return true;
}

或者这种奇特的方式:

function test(big, small)
{
  var map = Object.keys(big).reduce(function(map, key) {
    map[key.toLowerCase()] = true;
    return map;
  }, {});
  return Object.keys(small).all(function(key) {
    return key.toLowerCase() in map;
  });
}

最新更新