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

标签 javascript loops

我需要迭代两个对象并检查它们的键是否匹配。诀窍是,我需要确保键都是小写的。我已经发布了相关内容here

如果我只是循环遍历两个对象并检查匹配项,这很容易完成。但这意味着我最多只能有一个运行时间,直到每个对象中的最后一个键为止。

我在上面放了一个计数器,结果得到了大量的支票:

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}));

关于javascript - 使用两个 for 循环与 if (k in obj) 迭代对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30498848/

相关文章:

javascript - 如何将函数注入(inject)到需求文件中?

javascript - 使用选择器感知将 CSS 解析为 JavaScript

c - 使用依赖循环展开循环

javascript - Javascript 中的空数组值

C++ For 循环和数组混淆

ruby - 使用 Mechanize 点击谷歌页面

javascript - JS中的多行输出

javascript - HighCharts + xAxis 标签格式化程序

javascript - 更新由 jQuery 更改的 Select 的 Angular ngModel

javascript - 当我运行这段 Javascript 代码时,为什么我的浏览器总是崩溃?