假设我有一个对象:
userInfo
我想搜索 userInfo 的每个节点,看看键 'username' 的值是否等于 foo。
userInfo[x].username == "foo"
是否有更好的方法来执行以下操作?
var matchFound = false;
for (var i = 0, len = userInfo.length; i < len; i++)
matchFound = userInfo[i].username == "foo";
最佳答案
如果不引入另一种数据结构,确实没有更好(更有效)的方法。答案实际上取决于您的使用情况,但您可以做一些不同的事情:
使用哈希创建单独的“索引”。这些结构会将键映射到源数组中的项目或索引。 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
您将不得不多做一些工作来保持索引和源数组之间的一致性。最好将两者都包装在另一个对象中以管理两者的内容。如果您希望根据多个字段查找对象,则此方法非常有用。
如果您不关心集合的顺序,您可以将整个事物更改为散列并按用户名进行索引
var userinfo = {}; userinfo["foo"] = {username: "foo", firstName: "Foo", lastName: "Bar"};
不过,需要考虑的一件事是,效率提升是否会超过维护索引所增加的代码复杂性。如果您没有进行大量搜索,并且 userinfo 集合中没有大量项目,那么编写通用搜索功能或使用像 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"));
关于javascript - 在 JS 对象中搜索值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7569718/