我需要迭代两个对象并检查它们的键是否匹配。诀窍是,我需要确保键都是小写的。我已经发布了相关内容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/