оптимизиация сравнения двух массивов разного вида
Здравствуйте!
Пишу скрипт для гугл экселя. Есть два массива: DataArray - двумерный массив, в который собрана информация со всех листов. имеет такой вид: DataArray[idSheet][sheetValues] т.е. например имеет данные DataArray["лист 1"]["А1:А100"] и тогда DataArray[0][10][0] возвращает значение ячейки А11 первого листа второй массив - tData - данные из текущего листа (который в данный момент открыт). Имеет такой вид: tData[sheetValues] Мне нужно сравнить эти два массива и записать название того листа, с которым нашлось совпадение. Т.е. если на текущем листе есть такая информация: А1 яблоки А2 груши А3 апельсины а на других листах, например на листе 15 также в одной из ячеек есть "груши", то в массив allNames добавляется значение "лист 15" под 2 идентификатором. Я написал рабочий код. Все работает хорошо, но проблема в том, что если на текущем листе имеется больше 100 записей, а общая база в 2-3 раза больше, то этот скрипт выполняется 5-10 минут. Хотелось бы узнать как можно оптимизировать этот процесс. в массиве NameArray содержится список всех листов. vName содержит название текущего листа counter - счетчик для случая, когда надо сравнить каждое значение текущего листа с остальными значениями этого листа (чтобы не было повторов на текущем листе). Если счетчик больше 1, то на листе есть дубликат. numRows - кол-во записей на текущем листе код var allNames = [""]; // Массив с кем есть дубликаты for(var k=0;k<numRows;k++){ allNames[k]=false; // заполняем false, ибо пока дубликатов ни у кого нету } for(var i=0;i<NameArray.length;i++){ for(var j=0;j<DataArray[i].length;j++){ var counter = 0; for(var k=0;k<tData.length;k++){ if(tData[k][0] == DataArray[i][j][0] && vName != i && tData[k][0]!=""){ //Если данные на другом листе уже есть, allNames[k]=NameArray[i]; // то заносим его название в массив на позицию i }else if(tData[k][0] == DataArray[i][j][0] && vName == i && tData[k][0]!=""){ //Если данные на текущем листе уже есть, if(counter == 1){ // то также заносим его название в массив на позицию i allNames[k]=NameArray[i]; } counter++; } } } } |
6aPHaK,
может вы напишите три массива для примера, что сравниваем, что на выходе? из ваших обьяснений неособо понятно. |
Дабы ускорить, - Переделать массивы в объекты(скриптом или изначально
var arr1={ 'А1' : 'яблоки', 'А2' : 'груши', 'А3' : 'апельсины', 'А5' : '123' } var arr2={ 'А1' : 'грибы', 'А2' : 'груши', 'А3' : 'ананасы', 'А4' : 'трусы', 'А5' : '123' } var arrSumm ={} //массив совпадений var Lng1 = arr1.length; var Lng2 = arr2.length; var a=arr1,b = arr2; if(Lng2>Lng1){a=arr2;b = arr1}; var arrname="arr2" for(var pos in a) { if(a[pos]===b[pos]) arrSumm[pos]=['Cовпадения с '+arrname+'> '+pos+':'+b[pos]] } for(var i in arrSumm) { alert(i+':'+arrSumm[i]) } |
Часовой пояс GMT +3, время: 18:23. |