Эффективный поиск по массиву объектов в Javascript - PullRequest
0 голосов
/ 08 июня 2019

допустим, у меня есть предварительно упорядоченный массив объектов, такой как этот:

let data = [
    { moment: '00:01', otherProp: 'something', somethingMore: 'someelse'},
    { moment: '01:10', otherProp: 'something', somethingMore: 'someelse'},
    { moment: '05:37', otherProp: 'something', somethingMore: 'someelse'},
    { moment: '07:51', otherProp: 'something', somethingMore: 'someelse'},
    //and so on
]

У меня есть входные данные x, которые отформатированы как строка час: минуты (например, x = '06: 05 ') и мне нужно найти два последовательных объекта (data [i] и data [i + 1]), чтобы data [i] .moment <= x <data [i + 1] .moment </p>

Предположим, в массиве почти 200 элементов, и мне нужен самый быстрый способ найти результаты.Должен ли я реализовать бинарный поиск с нуля?Есть ли библиотека, которую я могу использовать?

Ответы [ 2 ]

1 голос
/ 08 июня 2019
var pos = data.indexOf(data.find(function(obj) { 
    var value = (obj.moment.split(":")[0]*60) + (obj.moment.split(":")[1]*1)
    var key =(search.split(":")[0]*60) + (search.split(":")[1]*1);
    return (key < value);
   }));

pos = pos >= 0 ? pos : data.length

data.splice(pos, 0, {moment:search, otherProp:"something", somethingMore: "someelse"});

Это будет работать.

1 голос
/ 08 июня 2019

Нужно ли реализовывать бинарный поиск с нуля?

в чем смысл?это всего лишь несколько строк кода:

let data = [
    { moment: '00:01', otherProp: 'something', somethingMore: 'someelse'},
    { moment: '01:10', otherProp: 'something', somethingMore: 'someelse'},
    { moment: '05:37', otherProp: 'something', somethingMore: 'someelse'},
    { moment: '07:51', otherProp: 'something', somethingMore: 'someelse'},
    //and so on
];
let search = '06:05';

let lo = -1, hi = data.length-1, mid;
while(hi > lo){
  if(data[mid=(lo+hi+1)>>1].moment > search) {
    hi = mid-1;
  } else {
    lo = mid;
  }
}

console.log(data[lo]);
console.log(search);
console.log(data[lo+1]);
.as-console-wrapper{top:0;max-height:100%!important}
...