我们有大量的对象:
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;
}
}
这样做的优化方法是什么?
答案 0 :(得分:2)
您应该将学生数据保存在像JHashtable这样的哈希表中,而不是数组中。对于复杂情况,您可以维护多个哈希表,例如studentsById
,studentsByCountryCode
等。
答案 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*/
}