我可以对对象数组进行二分查找吗?

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;
}