javascript - 使用键或循环在 Javascript 中访问对象属性的区别

标签 javascript object optimization object-properties

我有一个线性(或单一维度)对象,在单个记录中有超过 1000 个属性。我要遍历超过10000条记录。有时所需的属性可能不包含在单个记录中的对象中。我想知道通过循环对象的所有属性或通过引用直接检查对象中的键是否可用来遍历它们的更好策略是什么。请查看以下示例以更好地理解这一点。

让我们考虑一个示例场景:

var a = {
  "x": 1,
  "y": 2,
  "z": 3,
  "t": 4
}; //linear object
var flagA = false;
var b = {
  "x": 10,
  "y": 11,
  "z": 12
}; //linear object
var flagB = false;


//now I have to check the value of "t" in both objects.

//----------------------------------By use of looping-------------------------------//
for (var i in a) {
  if (i == "t") {
    flagA = true;
    break;
  }
}

for (var i in b) {
  if (i == "t") {
    flagB = true;
    break;
  }
}

//for object a
if (flagA) console.log("value found in object a for t:", a.t);
else console.log("value not found for t in object a");

//for object b
if (flagB) console.log("value found in object b for t:", a.t);
else console.log("value not found for t in object b");


//--------------------------------------------------------------------------------------//
console.log("\nANOTHER METHOD\n");
//-----------------------------------By use of Key-------------------------------------//

//for object a
if (a["t"]) console.log("value found in object a for t:", a["t"]);
else console.log("value not found for t in object a");

//for object b
if (b["t"]) console.log("value found in object b for t:", b["t"]);
else console.log("value not found for t in object b");
//--------------------------------------------------------------------------------------//

我应该使用哪一种方法,为什么?

最佳答案

循环在这里绝对是不必要的,特别是因为你正在处理对象的大量属性 - 检查属性是否存在是一个 O(1) 操作,而循环遍历所有属性搜索特定匹配项是一个 O(N) 操作。所以你的第二种方法肯定更好 - 它需要更少的时间,并且代码更易读。

也就是说:

if (a["t"]) console.log("value found in object a for t:", a["t"]);

这不是一个好的测试,因为如果该属性存在但值为 false,这将失败。

const a = {
  t: 0
};

if (a["t"]) {
  console.log("value found in object a for t:", a["t"]);
} else {
  console.log('not found!');
}

改用hasOwnProperty:

if (a.hasOwnProperty('t'))

var a = {
  "x": 1,
  "y": 2,
  "z": 3,
  "t": 4
};
var b = {
  "x": 10,
  "y": 11,
  "z": 12
};

const requiredProps = ['x', 't'];
const verify = obj => requiredProps.every(prop => obj.hasOwnProperty(prop));

console.log(
  verify(a),
  verify(b)
);

关于javascript - 使用键或循环在 Javascript 中访问对象属性的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57387302/

相关文章:

javascript - MVC5 单选按钮即时隐藏/显示

javascript - 在数组中查找重复对象并标记这些 [Javascript lodash]

algorithm - 带有哈希数组的背包 DP

algorithm - 如何优化查找 O(n^2) 以下的所有 session 冲突

c++ - O2 中导致 undefined symbol 的 gcc 优化标志

javascript - 函数的第一次执行总是比第二次执行慢吗?

javascript - javascript 变量的样式悬停状态

javascript - 如何调试 MSSQL 中的资源 #6 错误?

javascript - 将对象属性转换为对象数组

javascript - 如何通过对象名称动态检索对象属性?