Преобразовать последовательность чисел в случайно выглядящие идентификаторы?

Прежде всего, я думаю, что ваш набор данных неправильно структурирован. Вы не можете смешивать данные парка с данными вида. Это основная причина того, что у вас возникла эта проблема. Также проверьте способ доступа к элементам, это можно сделать намного проще, чем с помощью цикла for. В любом случае, давайте оставим это в стороне, я прыгну, чтобы попытаться решить последнюю недостающую часть проблемы.

Предполагая, что у вас есть название парка (ов), который соответствует критериям, вы можете просто найти в массиве объектов его имя и вернуть его координаты:

function getParkLocationByName(parkName) {
  let {latitude, longitude} = data.find(park => park.park_name === parkName);
  return {latitude, longitude};
}

let coords = getParkLocationByName('Acadia National Park');

console.log(coords)

Обратите внимание, что «данные» в этом фрагменте кода ваш оригинальный JSON.

5
задан Sean McSomething 15 April 2009 в 00:48
поделиться

4 ответа

Это можно сделать разными способами, в зависимости от того, что вы пытаетесь оптимизировать (скорость, использование памяти, и т. д.).

ID pattern = ddd c 1 c [0]

Вариант 1 (по сути, как хеширование, аналогично заку):
1 Генерировать случайное число между 0 и числом возможностей (676k).
2- Преобразовать число в комбинацию

    ddd = random / (26^2)
    c[0] = random % (26)
    c[1] = (random / 26) % 26

. ​​3- Запросить БД на наличие идентификатора и приращения, пока не будет найден свободный.

Вариант 2 (регистр сдвига с линейной обратной связью, см. wikipedia ):
1- Семя со случайным числом в диапазоне (0,676k). (Смотрите ниже, почему вы не можете посеять с '0')
2- Генерировать последующие случайные числа, применив следующее к текущему номеру ID

    num = (num >> 1) ^ (-(num & 1u) & 0x90000u);

. 3- Пропустить идентификаторы, превышающие диапазон (то есть 0xA50A0 +)
4- Преобразовать номер в формат идентификатора (как указано выше)
* Вам нужно будет сохранить последнее сгенерированное число, использованное для идентификатора, но вам не нужно будет запрашивать БД, чтобы узнать, используется ли оно. Это решение будет перечислять все возможные идентификаторы, кроме [000 AA] из-за того, как работает LFSR.

[править] Так как ваш диапазон на самом деле больше, чем вам нужно, вы можете получить обратно [000 AA], вычтя 1, прежде чем конвертировать в ID и иметь ваш действительный диапазон (0,0xA50A0]

4
ответ дан 18 December 2019 в 14:51
поделиться

Использовать конечную группу. В основном, возьмите 32- или 64-разрядное целое число и найдите большое число, взаимно простое с максимальным значением для вашего целого числа; Назовите это число M. Тогда для всех целых чисел n, n * M приведет к уникальному номеру, который имеет много цифр.

Это имеет то преимущество, что вам не нужно предварительно заполнять базу данных или запускать отдельный запрос на выборку - вы можете сделать все это в одном операторе вставки, если ваш n будет просто автоинкрементом и иметь отдельный столбец идентификатора, который по умолчанию равен n * M.

4
ответ дан 18 December 2019 в 14:51
поделиться

Вы можете сгенерировать случайный идентификатор, соответствующий этому стандарту, выбрать базу данных, чтобы увидеть, существует ли она уже, и вставить это в БД, чтобы отметить, что это было "использовано". В течение первых 25% срока службы этой схемы (или около 150 тыс. Записей) генерирование новых случайных идентификаторов должно быть относительно быстрым. Однако после этого потребуется больше и больше времени, и вы также можете предварительно заполнить таблицу, чтобы найти свободные идентификаторы.

4
ответ дан 18 December 2019 в 14:51
поделиться

В зависимости от того, что вы определяете как последовательный, вы можете просто выбрать определенную начальную точку на буквах, например, 'aa ', и просто переберите три цифры, так что это будет: 001aa 002aa 003aa

Как только вы доберетесь до zz, увеличьте числовую часть.

1
ответ дан 18 December 2019 в 14:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: