Javascript 我可以对一组对象进行二进制搜索吗?
我目前正在学习如何使用搜索和排序算法,我遇到了对客户数据对象数组进行二进制搜索的问题。客户数组按名字和姓氏排序 目标是找到客户的电子邮件并返回索引 数据如下所示:Javascript 我可以对一组对象进行二进制搜索吗?,javascript,arrays,object,binary-search-tree,Javascript,Arrays,Object,Binary Search Tree,我目前正在学习如何使用搜索和排序算法,我遇到了对客户数据对象数组进行二进制搜索的问题。客户数组按名字和姓氏排序 目标是找到客户的电子邮件并返回索引 数据如下所示: [ { "username": "Maude.Torp", "email": "Taya.Kerluke53@gmail.com", "address": { "street"
[
{
"username": "Maude.Torp",
"email": "Taya.Kerluke53@gmail.com",
"address": {
"street": "Rowe Fields",
"suite": "Suite 231",
"city": "Tiannamouth",
"zipcode": "07584-6653",
"geo": { "lat": "75.0283", "lng": "-17.1824" }
},
"phone": "795-827-5446 x18366",
"website": "nico.com",
"company": {
"name": "Champlin, Feest and Barrows",
"catchPhrase": "Object-based user-facing orchestration",
"bs": "transition integrated content"
},
"firstName": "Maida",
"lastName": "Feeney"
},
...
]
function searchByEmail(email, customers) {
let start = 0;
let end = customers.length - 1;
while (start <= end) {
let middle = Math.floor((start + end) / 2);
if (customers[middle] === email) {
return middle;
} else if (customers[middle] < email) {
start = middle + 1;
} else {
end = middle - 1;
}
}
return -1;
}
我的二进制搜索函数如下所示:
[
{
"username": "Maude.Torp",
"email": "Taya.Kerluke53@gmail.com",
"address": {
"street": "Rowe Fields",
"suite": "Suite 231",
"city": "Tiannamouth",
"zipcode": "07584-6653",
"geo": { "lat": "75.0283", "lng": "-17.1824" }
},
"phone": "795-827-5446 x18366",
"website": "nico.com",
"company": {
"name": "Champlin, Feest and Barrows",
"catchPhrase": "Object-based user-facing orchestration",
"bs": "transition integrated content"
},
"firstName": "Maida",
"lastName": "Feeney"
},
...
]
function searchByEmail(email, customers) {
let start = 0;
let end = customers.length - 1;
while (start <= end) {
let middle = Math.floor((start + end) / 2);
if (customers[middle] === email) {
return middle;
} else if (customers[middle] < email) {
start = middle + 1;
} else {
end = middle - 1;
}
}
return -1;
}
当我浏览这个对象数组时,只返回-1。如何更改此算法以适用于阵列中的对象?如果客户通过电子邮件订购,您应该能够对客户阵列进行二进制搜索 将代码稍微修改一点,以比较电子邮件而不是整个对象,从而访问对象的电子邮件属性
function searchByEmail(email, customers) {
let start = 0;
let end = customers.length - 1;
while (start <= end) {
let middle = Math.floor((start + end) / 2);
// NOTE the ".email" part added
if (customers[middle].email === email) {
return middle;
} else if (customers[middle].email < email) {
start = middle + 1;
} else {
end = middle - 1;
}
}
return -1;
}
功能通过电子邮件搜索(电子邮件,客户){
让start=0;
let end=customers.length-1;
while(start是按电子邮件地址排序的客户数组吗?这是您需要能够对电子邮件进行二进制搜索的内容。对,正如我将要说的:)还请注意,如果您从数据库中获取了那个大数组,您可能希望使用一些过滤器查询它,而不是检索所有客户,然后从完整的数据库中查找一个或多个客户list@Zorgatone太棒了,我很感激。你帮了我大忙!@alexwhitmore你很高兴调整是有意义的。如果是这样,这个函数会发生什么变化按名字和姓氏排序,而不是按电子邮件排序?它无法正确找到结果。数组必须按您要进行二进制搜索的键排序。如果不是按电子邮件排序,您可以对其进行排序,然后进行二进制搜索。我认为这应该比遍历整个数组更好(取决于ofc的排序算法)在最好的情况下,排序需要N*log(N)个步骤。在最坏的情况下,搜索需要N个步骤。对数组进行排序只是为了搜索是无用的