Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 27.02.2013, 15:37
Новичок на форуме
Отправить личное сообщение для 6aPHaK Посмотреть профиль Найти все сообщения от 6aPHaK
 
Регистрация: 27.02.2013
Сообщений: 1

оптимизиация сравнения двух массивов разного вида
Здравствуйте!

Пишу скрипт для гугл экселя. Есть два массива:
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++;
      }
    }
  }
}
Ответить с цитированием
  #2 (permalink)  
Старый 27.02.2013, 15:52
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,124

6aPHaK,
может вы напишите три массива для примера, что сравниваем, что на выходе? из ваших обьяснений неособо понятно.
Ответить с цитированием
  #3 (permalink)  
Старый 27.02.2013, 18:19
без статуса
Отправить личное сообщение для Deff Посмотреть профиль Найти все сообщения от Deff
 
Регистрация: 25.05.2012
Сообщений: 8,219

Дабы ускорить, - Переделать массивы в объекты(скриптом или изначально
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])
}
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск