是否有更有效的方法在对象数组中选择特定对象

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可以在这里找到

有更有效的方法吗?

Guf*_*ffa 5

您可以在找到对象时提前退出,这样您就不必遍历数组的其余部分:

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)

由于您必须在阵列更改后立即更新或重新创建索引,因此,如果您在阵列中进行搜索的频率远远超过更改阵列,则只会使用此索引.