繁体   English   中英

如何使用JavaScript / jQuery对数组或对象中的多个项进行索引?

[英]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响应,然后使用findByIdfindByTitle方法进行查询。

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM