【问题标题】:JavaScript Search and Loop - doesn't return correct valuesJavaScript 搜索和循环 - 不返回正确的值
【发布时间】:2017-07-15 11:41:45
【问题描述】:

请问,你能检查我的代码哪里出错了吗?它应该循环遍历 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

【问题讨论】:

标签: javascript arrays search


【解决方案1】:

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

其次,您应该使用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

注意:如果您想排除搜索字符串与多个 URL 匹配的可能性,则不需要break。然后push 仍然会阻止您覆盖以前的结果。

【讨论】:

  • 非常感谢!添加休息解决了它。如此简单..:) 谢谢!
【解决方案2】:

我看到你已经解决了)但也许你也会喜欢这段代码) 我猜 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});
 });

【讨论】:

  • 您好,谢谢您的提示。现在它正在工作,如果您好奇,这里是完整代码:) github.com/vlastapolach/SEO-Redirect 它正在使用文本框,您可以在其中粘贴 URL 列表并且每个 URL 都在新行上,如果您需要显示找到的匹配项或空格未找到确切的行顺序。一切都取决于用户输入,没有“硬编码”字符串。它应该对 SEO 专家有用,如果您喜欢,请随时下载并使用它:)
猜你喜欢
  • 2013-04-23
  • 2019-07-14
  • 1970-01-01
  • 1970-01-01
  • 2017-11-29
  • 1970-01-01
  • 1970-01-01
  • 2016-05-29
  • 1970-01-01
相关资源
最近更新 更多