JavaScript搜索和循环 - 不返回正确的值

时间:2017-07-15 11:41:45

标签: javascript arrays search

请您检查我的代码错误在哪里?它应该循环通过1个数组来选择每个字符串,然后遍历第二个数组并检查,如果第二个字符串的值包含第一个字符串的值。

  for (var i = 0; i < oldLines.length; i++){
    var subStringEach = oldLines[i];
    var subStringEachNoDash = subStringEach.replace(/[^a-z0-9]/g,'');

    // read New URLs and line by line save them as an object
    var newLines =  $('#newUrl').val().split(/\n/);
    var newUrlResult = [];

    for (var j = 0; j < newLines.length; j++){
      var newUrlString = newLines[j];
      var newUrlStringNoDash = newUrlString.replace(/[^a-z0-9]/g,'');

      var isThere = newUrlStringNoDash.search(subStringEachNoDash);
      if (isThere !== -1 ) {
        newUrlResult[i] = newLines[j];
      }
      else {
        newUrlResult[i] = "";
      }
    }

stockData.push({OldURL:oldLines[i],SearchSubstring:subStringEach,NewURL:newUrlResult[i]});
  }

现在它只找到部分结果..我放在第一个数组:

anica-apartment
casa-calamari-real
ostrovni-apartman

和第二个数组:

http://tempweb3.datastack.cz/be-property/anica-apartment/
http://tempweb3.datastack.cz/be-property/ostrovni-apartman/
http://tempweb3.datastack.cz/be-property/st-michael-apartment/
http://tempweb3.datastack.cz/be-property/casa-calamari-real/

它只会找到并返回casa-calamari-real, http://tempweb3.datastack.cz/be-property/casa-calamari-real/,其他人返回空..

有什么想法吗?

以下是Codepen的完整代码:https://codepen.io/vlastapolach/pen/VWRRXX

2 个答案:

答案 0 :(得分:3)

找到匹配后,您应该退出内循环,否则该循环的下一次迭代将再次清除您匹配的内容。

其次,您应该使用push而不是访问索引,因为您不知道您将获得多少结果。因此,您需要将查找字符串与它相关联(因为i在两个数组中都不一定相同)

所以替换:

  if (isThere !== -1 ) {
    newUrlResult[i] = newLines[j];
  }
  else {
    newUrlResult[i] = "";
  }

用这个:

  if (isThere !== -1 ) {
    newUrlResult.push({
        searchSubstring: subStringEach, 
        newURL: newUrlString
    });
    break; // exit loop
  }

最后,只输出newUrlResult

注意:如果您想让搜索字符串与多个网址匹配,那么您不需要breakpush仍会阻止您覆盖之前的结果。

答案 1 :(得分:0)

我看到你已经解决了)但也许你会喜欢这个代码) 我猜想newUrlResult变量可能是一个字符串,因为当找到一个值时循环中断。如果找不到任何值,那么就会出现空字符串。而且我不确定你需要在每次迭代时调用newLines = $('#newUrl')。val()。split(/ \ n /)。

var stockData = [];
 
 oldLines.map(function(oldLine){
      var cleanOldLine = oldLine.replace(/[^a-z0-9]/g,''),
          newLines =  $('#newUrl').val().split(/\n/),
          newUrlResult = '';
      
      for (var j = 0; j < newLines.length; j++){
      	var newLine = newLines[j],
            cleanNewLine = newLine.replace(/[^a-z0-9]/g,''),
            ifExists = cleanNewLine.search(cleanOldLine);
        
        if (ifExists !== -1) {
            newUrlResult = newLine;
            break;
        }
      }
      
      stockData.push({OldURL:oldLine, SearchSubstring:cleanOldLine, NewURL:newUrlResult});
 });