Лучший способ поиска в массиве объектов на основе заданного диапазона в числах - PullRequest
0 голосов
/ 02 октября 2019

Например, у нас есть массив, подобный

var arr = [{'startTime': 0, 'endTime': 2}, 
           {'startTime': 1, 'endTime': 3},
           {'startTime': 4, 'endTime': 9},
           {'startTime': 5, 'endTime': 9},
           {'startTime': 7, 'endTime': 13},
           {'startTime': 20, 'endTime': 25},
           {'startTime': 27, 'endTime': 32},
           {'startTime': 30, 'endTime': 35},
          ]

, этот массив может иметь любую длину. Теперь, если нужно получить результат 8 в качестве текущего времени, тогда нам нужно выполнить поиск по всему элементу. где 8 находится в диапазоне. поэтому результат будет

           [{'startTime': 4, 'endTime': 9},
           {'startTime': 5, 'endTime': 9},
           {'startTime': 7, 'endTime': 13},]

Каков наилучший способ поиска этого в минимальных итерациях в массиве?

Ответы [ 4 ]

3 голосов
/ 02 октября 2019

попробуй вот так.

var arr = [{'startTime': 0, 'endTime': 2}, 
           {'startTime': 1, 'endTime': 3},
           {'startTime': 4, 'endTime': 9},
           {'startTime': 5, 'endTime': 9},
           {'startTime': 7, 'endTime': 13},
           {'startTime': 20, 'endTime': 25},
           {'startTime': 27, 'endTime': 32},
           {'startTime': 30, 'endTime': 35},
          ];

console.log(arr.filter((item, index) => (item.startTime <= 8 && item.endTime >= 8)));
1 голос
/ 02 октября 2019

Этого можно достичь с помощью Array#filter() с предикатом:

item => item.startTime <= value && value <= item.endTime

Где item - это фильтруемый элемент arr, а value - этозначение, проверяемое на герметичность в диапазоне item.

Это может быть выражено в виде кода:

var arr = [{'startTime': 0, 'endTime': 2}, 
           {'startTime': 1, 'endTime': 3},
           {'startTime': 4, 'endTime': 9},
           {'startTime': 5, 'endTime': 9},
           {'startTime': 7, 'endTime': 13},
           {'startTime': 20, 'endTime': 25},
           {'startTime': 27, 'endTime': 32},
           {'startTime': 30, 'endTime': 35},
          ];
     
/* Filters items of arr that have a range containing the specified value */
const getItemsContaining = (value) => arr.filter(item => item.startTime <= value && value <= item.endTime)

console.log(getItemsContaining(8))
0 голосов
/ 02 октября 2019

Вот реализация бинарного дерева поиска в javascript. Вы можете проверить это https://www.geeksforgeeks.org/implementation-binary-search-tree-javascript/

0 голосов
/ 02 октября 2019

Вы можете использовать filter для фильтрации массива:

var arr = [{'startTime': 0, 'endTime': 2}, 
           {'startTime': 1, 'endTime': 3},
           {'startTime': 4, 'endTime': 9},
           {'startTime': 5, 'endTime': 9},
           {'startTime': 7, 'endTime': 13},
           {'startTime': 20, 'endTime': 25},
           {'startTime': 27, 'endTime': 32},
           {'startTime': 30, 'endTime': 35},
          ]

console.log(arr.filter(el => el.startTime < 8 && el.endTime > 8))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...