Google App Script: ускорение / альтернатива циклу

1

Я новичок в скриптах приложений Google. Все идет нормально. Попытка сделать некоторые вещи, которые я использовал в БД MsAccess. Я думаю, что у меня есть проблема, которая может быть связана с огромным количеством данных, которые у меня есть. Чтобы проиллюстрировать мою проблему:

У меня два массива:

**Array1**

ID || Name <br>
0001 || Peter<br>
0005 || Arthur<br>
0008 || Gloria<br>
0010 || Martin<br>
0014 || Jess <br>


**Array2**

ID || Age <br>
0001 || 23<br>
0002 || 18<br>
0005 || 24<br>
0010 || 7<br>

Как вы можете себе представить, я хочу создать нечто вроде:

**Array3**

ID || Name || Age <br>
0001 || Peter || 23<br>
0005 || Arthur|| 24 <br>
0010 || Martin || 7<br>

Я использовал самый простой код, который я могу придумать для "join":

for (var a=0; a<array1.length; a++) {
    for (var b=0; b<array2.length; b++) {
        if (array1[a][0] == array2[b][0]) {
            array3.push([array1[a][0],array1[a][1],array2[b][1]); break;
        }
    }
}

Проблема в том, что array1 составляет 70 000 записей, а array2 составляет около 10 000 записей, что означает, что код заканчивается.

Что бы вы сделали, ребята?

  • 0
    Как вы получаете массив "а" --- вы создаете его?
  • 0
    Кроме того, вы думали об использовании бесплатной базы данных, такой как MySQL или Postgre? :)
Показать ещё 4 комментария
Теги:
arrays
performance
loops

1 ответ

1

Создайте вспомогательный объект, имена свойств которого являются значениями id из array2 (или array1; вы можете попробовать оба и посмотреть, что быстрее):

var a2map = {};
for (var a = 0; a < array2.length; a++)
  a2map[array2[a][0]] = array2[a];

Теперь вы можете выполнять итерацию через array1 в поисках совпадений:

for (var a = 0; a < array1.length; a++)
  if (array1[a][0] in a2map)
    array3.push([ array1[a][0], array1[a][1], a2map[array1[a][0]][1] ]);

У вашего оригинального алгоритма будет время выполнения, которое примерно пропорционально 70000 * 20000, что является большим числом. Это будет ближе всего к 90000 или около того, делая это в тысячи раз быстрее.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню