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个步骤。对数组进行排序只是为了搜索是无用的