如何基于一个属性优化JS对象的数组查找

时间:2013-01-31 22:25:18

标签: javascript jquery arrays

我们有大量的对象:

var englishStudents = [
    {StudentId: 1, Name: "John"},
    {StudentId: 2, Name: "Jack"},
    {StudentId: 3, Name: "Jane"}
];

需要检查此数组中是否包含其他类似对象,只需比较一个属性即可。

var randomStudent = {StudentId: 1337, Name: "Foo"};

这就是我所拥有的,似乎它会起作用,但我不认为这是最好的方法。

var studentIds = $.map(englishStudents, function (student, index) { return student.StudentId; });
var randomStudentLearnsEnglish = false;
for (var sId in studentIds) {
    if (randomStudent.StudentId == sId) {
        randomStudentLearnsEnglish = true;
        break;
    }
}

这样做的优化方法是什么?

4 个答案:

答案 0 :(得分:2)

您应该将学生数据保存在像JHashtable这样的哈希表中,而不是数组中。对于复杂情况,您可以维护多个哈希表,例如studentsByIdstudentsByCountryCode等。

答案 1 :(得分:1)

只需做一个哈希而不是一个数组,所以:

var englishStudents = {
    1: {StudentId: 1, Name: "John"},
    2: {StudentId: 2, Name: "Jack"},
    3: {StudentId: 3, Name: "Jane"}
};

然后检索,只需执行:

var student = englishStudents[id];

答案 2 :(得分:1)

如果您真的想要,可以创建进一步的索引方案:

var englishStudents = [
    {StudentId: 1, Name: "John"},
    {StudentId: 2, Name: "Jack"},
    {StudentId: 3, Name: "Jane"}
];
 //if doing this a lot of time, take the one time hit of construction and memory
var idToNameMap = createIdToNameMap(englishStudents); //returns {'1': 'John', '2': Jack' , '3': 'Jane'}

var randomStudent = getRandomStudent();
if( idToNameMap[ randomStudent.StudentId] != undefined){ ... }

答案 3 :(得分:1)

如果您只想知道ID是否存在可以执行此操作:

function checkIdExists( id){
    /* map array of matching ID, if none exists length of array is zero*/
    return  $.map(englishStudents, function (student, index) { 
               return student.StudentId==id; 
    }).get().length;
});

使用:

 if( checkIdExists( 1234)){
     /* run exists code*/
 }