[英]How do I index by multiple items in an Array or Object using JavaScript/jQuery?
我在Ajax调用返回的结果对象中有一个数据Array。 数据如下所示:
{ Name="User1 Name1", FirstName="User1", Id="005400000001234567", more...}
{ Name="User2 Name1", FirstName="User2", Id="005400000001234568", more...}
每个项目看起来像这样:
{
Id:"005400000001234567",
Name:"User Name",
FirstName:"User",
LastName:"Name",
Title:"Manager"
}
我希望能够通过Id (返回单个用户)或Title (返回用户数组)来检索数据。 使用JavaScript 或 jQuery进行此操作的最佳方法是什么?
这是我到目前为止所做的尝试:
function GetAllUsers()
{
AllUsersById = new Object();
MyClass.MyAjaxMethod(function(result,event) {
if(result) {
j$(result).each(function(index,item)
{
AllUsersById[item.Id] = item;
});
}
});
}
我上面的代码很适合用Id编制索引,但我不知道该怎么做Title。
顺便说一下,大约有1000条记录 ,我需要这个记录才能相当高效 。 (这是我在文档准备就绪时立即获取数据的原因之一。但我不是JavaScript或jQuery效率方面的专家。如果你有更好的方法,请告诉我。)
有任何想法吗? 提前致谢!
好像你在寻找.grep() 。 使用.grep你可以创建一个可以过滤的泛型函数:
function findInJson (json, key, value) {
return $.grep(json, function (obj) {
return obj[key] == value;
});
}
// With your data getting a specific user by id
findInJson(yourJSON, "Id", "005400000001234567");
// Getting a set of users by title
findInJson(yourJSON, "Title", "Manager");
创建一个构造函数,相对于封装此数据的类,您可以要求它按标题或ID查找用户。 要进行快速查找,您可以创建两个查找表 - 一个用于id,另一个用于标题。 假设一个合适的散列实现,查找可以平均在O(1)
完成。 初始计算是O(n),但查找速度更快。 它还使用了更多的空间,因为我们正在创建两个额外的地图。 对于1000个对象,这不是问题。 同样,如果您要进行更多查找,这种方法会更快。
这是一个简单的实现。
function Users(users) {
this.idMap = {};
this.titleMap = {};
this.users = users;
var me = this;
users.forEach(function(user) {
this.idMap[user.Id] = this.idMap[user.Id] || [];
this.idMap[user.Id].push(user);
this.titleMap[user.Title] = this.titleMap[user.Title] || [];
this.titleMap[user.Title].push(user);
}.bind(this));
}
Users.prototype.findByTitle = function(title) {
return this.titleMap[title];
};
Users.prototype.findById = function(id) {
return this.idMap[id];
};
要使用它,请创建一个Users
对象,向其传递AJAX响应,然后使用findById
和findByTitle
方法进行查询。
var users = new Users(responseData);
users.findById("1");
users.findByTitle("SomeTitle");
查看一个工作示例 。
我认为这应该有效。 没有你的数据,我真的无法测试它。
function GetAllUsers()
{
AllUsersById = new Object();
AllUsersByType = new Object();
MyClass.MyAjaxMethod(function(result,event) {
if(result) {
j$(result).each(function(index,item)
{
// By Id
AllUsersById[item.Id] = item;
// By Type
if (!AllUsersByTitle[item.Title]) {
AllUsersByTitle[item.Title] = new Array();
}
AllUsersByType[item.type].push() = item;
});
}
});
}
如果您可以控制返回的数据,那么使用以下格式生成数据会更好:
var allUsers=[
{"005400000001234567":{
Name:"User Name",
FirstName:"User",
LastName:"Name",`
Title:"Manager"
}}
,{"005400000001234568":{
Name:"User2 Name2",
FirstName:"User2",
LastName:"Name2",
Title:"Manager2"
}}
/*..etc.. */
];
这样就可以避免GetAllUsers
(构建上面的数组)中的循环( $(result).each()
)。 可以通过构建表单的第二个数组来有效地执行按title
搜索:
var byTitle=["title1":[0,1], "title1":[0,1], /*etc*/];
如您所见,每个标题都有一个allUsers
的索引列表。 然后你只需:
var allManagers = [];
for(var i in byTitle["Manager"]) allManagers.push(allUsers[i]);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.