При использовании разных переменных оба массива модифицируются - PullRequest
0 голосов
/ 11 января 2019

Итак, я занимался небольшой поисковой системой для Google Sheets и не хотел, чтобы она чувствительна к регистру, поэтому я заставляю ее объявлять «RealComments» как фактический контент для извлечения, а затем переходить к строчным буквам «Комментарии». массив строка за строкой в ​​главном цикле.

Мне кажется, что это должно работать, это разные переменные, и я возвращаю RealComments, а не Комментарии. Но в моем коде происходит какая-то странная квантовая запутанность, потому что независимо от того, как я это объявляю, каждый раз, когда я применяю метод toLowecase () к обоим массивам RealComments или Comments, оба модифицируются.

Понятия не имею, почему это или как это исправить. Вот полный код:

/**
 * Searches for relevant questions and answers
 *
 * @param {cell} Keywords Cell with comma separated list
 * @param {cell} Query Cell with text in question format
 * @param {cell} Type Validation cell with options, leave "Any" for no filter
 * @param {column} TypeOfComment Array with the type of question column
 * @param {array} Comments Array with the questions and answers in two columns
 * @param {column} ScreenshotLinks Array with the screenshot link column
 * @return Your answer. :)
 * @customfunction
 */
function SearchQuery(Keywords,Query,Type,TypeOfComment,Comments,ScreenshotLinks) {
  if(Keywords==""){
    return "Please type your query/keywords above for results to be displayed here."
  }
  var ResultArray = [];
  var Score = 0;
  var MinimumScore = 2;
  var MinimumScorePosition = 0;
  var keywords = [];
  var querywords = [];
  var RealComments = Comments;
  for(rows in RealComments){
    RealComments[rows].push(ScreenshotLinks[rows][0]);
  }
  var RemaneingKeywords = CleanPunctuation(Keywords);
  var RemaneingQuery = CleanPunctuation(Query);
  var NextSpace = RemaneingKeywords.indexOf(' ');
  while(NextSpace != -1){
    keywords.push(RemaneingKeywords.substr(0,NextSpace));
    RemaneingKeywords = RemaneingKeywords.substr(NextSpace+1,RemaneingKeywords.length);
    NextSpace = RemaneingKeywords.indexOf(' ');
  }
  keywords.push(RemaneingKeywords);
  NextSpace = RemaneingQuery.indexOf(' ');
  while(NextSpace != -1){
    querywords.push(RemaneingQuery.substr(0,NextSpace));
    RemaneingQuery = RemaneingQuery.substr(NextSpace+1,RemaneingQuery.length);
    NextSpace = RemaneingQuery.indexOf(' ');
  }
  querywords.push(RemaneingQuery);
  for(rows in Comments){
    Comments[rows][0] = Comments[rows][0].toLowerCase(); //Investigate lowercase glitch
    Comments[rows][1] = Comments[rows][1].toLowerCase();
    if(Type=="Any"||TypeOfComment[rows]==Type){
      Score = 0;
      for(keyword in keywords){
        if(Comments[rows][0].indexOf(keywords[keyword])!=-1||Comments[rows][1].indexOf(keywords[keyword])!=-1){
          Score = Score+10;
        }
      }
      for(words in querywords){
        if(Comments[rows][0].indexOf(querywords[words])!=-1||Comments[rows][1].indexOf(querywords[words])!=-1){
          Score = Score+1;
        }
      }
      if(ResultArray.length<20 && Score>2){
        ResultArray.push(RealComments[rows]);
        ResultArray.push(Score);
        MinimumScore = FindMinimumScore(ResultArray);//Math.min.apply(null,ResultArray);
      }
      else{if(Score>MinimumScore){
        MinimumScorePosition = ResultArray.indexOf(MinimumScore);
        ResultArray.splice(MinimumScorePosition-1,2);
        ResultArray.push(RealComments[rows]);
        ResultArray.push(Score);
        MinimumScore = FindMinimumScore(ResultArray);
      }}
    }
  }
  var ScoresForSorting = []; //Sorting the responses here
  for(i=0;i<10;i++){
    if(ResultArray[i+1]==undefined){ScoresForSorting.push(-2);}
    else{ScoresForSorting.push(parseInt(ResultArray.splice(i+1,1)));}
  }
  var ResponseOrder = [];
  for(i=0;i<10;i++){
    MinimumScorePosition = ScoresForSorting.indexOf(Math.max(ScoresForSorting[0],ScoresForSorting[1],ScoresForSorting[2],ScoresForSorting[3],ScoresForSorting[4],ScoresForSorting[5],ScoresForSorting[6],ScoresForSorting[7],ScoresForSorting[8],ScoresForSorting[9]));
    ResponseOrder.push(MinimumScorePosition);
    ScoresForSorting[MinimumScorePosition]=-3;
  }
  var SortedResultArray = [];
  for(results in ResponseOrder){
    SortedResultArray.push(ResultArray[ResponseOrder[results]]);
  }
  if(SortedResultArray[0]==undefined){SortedResultArray = []; SortedResultArray.push("Sorry, No Result Was Found To Your Search. ) : ");}
  return SortedResultArray
}
function FindMinimumScore(ResultArray){
  return Math.min(ResultArray[1],ResultArray[3],ResultArray[5],ResultArray[7],ResultArray[9],ResultArray[11],ResultArray[13],ResultArray[15],ResultArray[17],ResultArray[19])
}
function CleanTwoLetterWords(words){
  var badwords = ["do","in","at","it","of","as","be","if","or","we","by","an","or","no","my","vs"];
  for(badword in badwords){words = words.replace(badwords[badword],"");}
  return words
}
function CleanThreeLetterWords(words){
  if(parseInt(words)>9){return ""} //remove numbers
  var badwords = ["and","for"];
  for(badword in badwords){words = words.replace(badwords[badword],"");}
  return words
}
function CleanPunctuation(words){
  words = words.toLowerCase();
  var badlettergroup = ["{","}",",",":","+","-","™","®","?","!","(",")","'"];
  for(letter in badlettergroup){while(words.indexOf(badlettergroup[letter]) != -1){words = words.replace(badlettergroup[letter]," ");}}
  return words
}
function MakeThingsSingular(words){
  var exceptions = ["this"];
  if(exceptions.indexOf(words) != -1){return words}
  var wordl = words.length;
  if(words.substr(wordl-1,wordl) == "s" && words.substr(wordl-2,wordl) != "ss"){return words.substr(0,wordl-1)}
  return words
}

Я написал все сам, но я не думаю, что все это особенно блестяще, поэтому не стесняйтесь копировать. Кроме того, предложить улучшения, если у вас есть. Но самое главное, если у вас есть идея, почему строки, составляющие массив комментариев, будут влиять на RealComments и / или как это исправить, пожалуйста, дайте мне знать.

EDIT:

Итак, после еще нескольких исследований и полезных ответов я попытался объявить RealComments следующим образом:

  var RealComments = [];
  for(rows in Comments){
    RealComments.push(Comments[rows]);
  }

В этом случае сбой сохраняется.

  var RealComments = [...Comments];

Что возвращает синтаксическую ошибку.

  var RealComments = Comments.slice();

В этом случае глюк все еще сохраняется. ...

В общем, я до сих пор не понимаю, что не так с кодом, комментирование одной из строчных букв влияет на столбец, который вы ожидаете в RealComments, как если бы они все еще были связаны.

Comments[rows][0] = Comments[rows][0].toLowerCase();
Comments[rows][1] = Comments[rows][1].toLowerCase();

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

Ответы [ 2 ]

0 голосов
/ 15 января 2019

TheMaster указал, что «slice () не будет работать, потому что Comments это не массив, а массив массивов». После чего решение, которое сделало это для меня, просто использовало:

var newArray = JSON.parse(JSON.stringify(orgArray));

Что в моем случае было:

var RealComments = JSON.parse(JSON.stringify(Comments));

Спасибо за помощь! Я надеюсь, что это помогает другим пользователям.

0 голосов
/ 11 января 2019

В javascript Array назначение создает ссылку, а не копию.

если вы делаете

var a = [1,2,3,4];

var b = a;

b будет ссылкой для a. Это означает, что если вы измените b, то на самом деле это изменит a.

БЫСТРОЕ РЕШЕНИЕ в линии, где вы делаете var RealComments = Comments;

Сделайте это вместо var RealComments = Comments.slice();

Пока Comments является массивом, метод slice будет возвращать новый экземпляр массива Comments. Таким образом, изменение RealComments больше не изменит Comments.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...