我可以对对象数组进行二分查找吗?
Can I do a binary search on an array of objects?
我目前正在学习如何使用搜索和排序算法,并且我 运行 遇到了对客户数据对象数组进行二分搜索的问题。客户数组按名字和姓氏排序。
目标是找到客户的电子邮件和 return 索引。
数据如下:
[
{
"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;
}
在一个排序的数字数组上,我能够 return 所需键的索引。
let customers = [1, 10, 45, 56, 66, 567]
...
console.log(searchByEmail(66, customers))
// --> 4
当我查看这个对象数组时,我只有 return -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;
}
我目前正在学习如何使用搜索和排序算法,并且我 运行 遇到了对客户数据对象数组进行二分搜索的问题。客户数组按名字和姓氏排序。
目标是找到客户的电子邮件和 return 索引。
数据如下:
[
{
"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;
}
在一个排序的数字数组上,我能够 return 所需键的索引。
let customers = [1, 10, 45, 56, 66, 567]
...
console.log(searchByEmail(66, customers))
// --> 4
当我查看这个对象数组时,我只有 return -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;
}