说我有一个对象:
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";
答案 0 :(得分:4)
如果不引入另一种数据结构,就没有更好的(更有效的)方法。答案真的取决于你的用法,但你可以做一些不同的事情:
使用哈希创建单独的“索引”。这些结构将键映射到源数组中的项或索引。 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"};
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"));
答案 1 :(得分:3)
不需要三元运算符,请考虑以下因素:
var matchFound = false;
for (var i = 0, len = userInfo.length; i < len; i++)
{
matchFound = userInfo[i].username == "foo";
if(matchFound){
break;
}
}
答案 2 :(得分:1)
下划线JS库有一些方便的方法来处理数据集合 - 例如select method
实现它就像这样:
var userInfo = {
'x':{
username: "foo",
password:'dlji'
},
'y':{
username: "bar" ,
password:'adfasf'
},
'z': {
username: 'foo',
password:'d3alj4i'
}
};
var found = _.select(userInfo, function(node){
return node.username === "foo"
});
console.dir (found);
下划线并不是很大,虽然你也可以在原生JS中做到这一点,但我认为它可以很好地实现你自己提出的解决方案。基本上,它为您提供了许多您认为应该存在的JS功能。