Mik*_*den 2 javascript performance
给出以下数据结构
var things = [{ "name": "thing1", "sex": "male"},
{ "name": "thing2", "sex": "female"}];
Run Code Online (Sandbox Code Playgroud)
我希望能够搜索该对象数组并拉出一个特定的对象.
我目前编写了以下代码
function selectElementByName (name) {
var returnObject;
for (var i = 0; i < things.length; i++) {
if (things[i].name === name) {
returnObject = things[i];
}
}
if ( returnObject === undefined) {
console.log("Object not found");
}
return returnObject;
}
Run Code Online (Sandbox Code Playgroud)
JsFiddle可以在这里找到
有更有效的方法吗?
您可以在找到对象时提前退出,这样您就不必遍历数组的其余部分:
function selectElementByName(name) {
for (var i = 0; i < things.length; i++) {
if (things[i].name === name) {
return things[i];
}
}
console.log("Object not found");
}
Run Code Online (Sandbox Code Playgroud)
(但是如果存在重复,这将改变行为,以便它返回找到的第一个对象而不是最后一个.)
如果名称是唯一的,则可以将它们用作键并将对象存储在对象中而不是数组中:
var things = {
"thing1": { "name": "thing1", "sex": "male"},
"thing2": { "name": "thing2", "sex": "female"}
};
Run Code Online (Sandbox Code Playgroud)
然后你不需要循环来找到一个对象:
function selectElementByName(name) {
return things[name];
}
Run Code Online (Sandbox Code Playgroud)
如果您需要数组中的对象,您仍然可以创建一个索引来搜索数组是否经常更改:
var thingsNameIndex = {};
for (var i = 0; i < things.length; i++) {
thingsNameIndex[things[i].name] = i;
}
Run Code Online (Sandbox Code Playgroud)
现在您可以使用索引来查找对象:
function selectElementByName(name) {
return things[thingsNameIndex[name]];
}
Run Code Online (Sandbox Code Playgroud)
由于您必须在阵列更改后立即更新或重新创建索引,因此,如果您在阵列中进行搜索的频率远远超过更改阵列,则只会使用此索引.