使用键或循环在 Javascript 中访问对象 属性 之间的区别
Difference between Object property accessing in Javascript using key or loop
我有一个线性(或单维)对象,在一条记录中有超过 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"]);
不是一个好的测试,因为如果 属性 存在,但该值是假的,这将失败。
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)
);
我有一个线性(或单维)对象,在一条记录中有超过 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"]);
不是一个好的测试,因为如果 属性 存在,但该值是假的,这将失败。
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)
);