dor*_*emi 5 javascript loops javascript-objects
说我有一个对象:
userInfo
Run Code Online (Sandbox Code Playgroud)
我想搜索userInfo的每个节点以查看键“ username”是否具有等于foo的值。
userInfo[x].username == "foo"
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法来执行以下操作?
var matchFound = false;
for (var i = 0, len = userInfo.length; i < len; i++)
matchFound = userInfo[i].username == "foo";
Run Code Online (Sandbox Code Playgroud)
在不引入另一种数据结构的情况下,确实没有更好(更有效)的方法。答案实际上取决于您的使用情况,但您可以做一些不同的事情:
使用哈希创建单独的“索引”。这些结构会将键映射到源数组中的项目或索引。JavaScript 对象/哈希支持基于键的查找并且应该是高效的。
userinfo[x].username = "foo";
// Index the objects
usersByName = {};
usersByName["foo"] = userinfo[x];
// -- OR -- index the array indices
var usersByName["foo"] = x;
// Test for key
"foo" in usersByName; // true
Run Code Online (Sandbox Code Playgroud)
您必须投入更多的工作来维护索引和源数组之间的一致性。最好将两者包装在另一个对象中以管理两者的内容。如果您想要通过多个字段查找对象,则此方法非常有用。
如果您不关心集合的顺序,您可以将整个集合更改为哈希值并按用户名索引
var userinfo = {};
userinfo["foo"] = {username: "foo", firstName: "Foo", lastName: "Bar"};
Run Code Online (Sandbox Code Playgroud)不过,需要考虑的一件事是,效率的提高是否会超过维护索引所增加的代码复杂性。如果您没有进行大量搜索,并且用户信息集合中没有大量项目,那么编写通用搜索函数或使用像 Philip Schweiger 提到的那样的库可能更有意义。
function findObjectByAttribute (items, attribute, value) {
for (var i = 0; i < items.length; i++) {
if (items[i][attribute] === value) {
return items[i];
}
}
return null;
}
var userinfo = [];
userinfo[0] = {username: "foo"};
console.log(findObjectByAttribute(userinfo, "username", "foo"));
Run Code Online (Sandbox Code Playgroud)