【问题标题】:JavaScript array of strings not ComparingJavaScript 字符串数组不比较
【发布时间】:2017-01-31 05:32:33
【问题描述】:

该程序应该从 2 个文本文件中获取输入。第一个包含数据对,每对都在自己的文本行中。第一段是一个单词,第二段是一个代表重量的数字。第二个文件是一个单词列表,每个单词都在自己的行中。我已经测试了输入流,并且我知道文件正在输入到每个数组中。当我去比较字符串的组合时,单词不会在它们应该比较的时候比较相等。我已经检查以确保它们是基本字符串而不是对象。我尝试了 ==、=== 和 localeCompare(),但没有成功。我修剪了字符串,使用 valueOf() 和 toString() 也不起作用。任何帮助将不胜感激。

<!-- File:  Enter filename -->
<!DOCTYPE html>

<html>

<head>
  <meta charset="utf-8">
  <title>Mod D 3: Revenge of the JS</title>
</head>

<body>
  <input onchange="loadFile(id)" type="file" name="fileName" id="firstFile" accept=".txt">
  <br>
  <input onchange="loadFile(id)" type="file" name="fileName2" id="secondFile" accept=".txt">
  <br>
  <br>
  <button onclick="compareFiles()">compare files</button>
  <br>
  <br>

  <textarea readonly name="textStuff" id="textStuff" cols="30" rows="15" style="resize none;" data-role="none"></textarea>
  <script>
    var display = document.getElementById("textStuff");
    var file1Words = [];
    var file1Weight = [];
    var file2Words = [];
    var words = [];
    var testingFiles = false;

    function loadFile(idname) {
      console.log("arrived at load function");
      var file = document.getElementById(idname).files[0];
      var reader = new FileReader();
      reader.onload = function(progressEvent) {
        var lineNum = this.result.split('\n');
        if (idname == 'firstFile') {
          console.log("found the first file");
          for (var i = 0; i < lineNum.length; i++) {
            var holder = lineNum[i].split(" ");
            console.log("loading...");
            file1Words.push(holder[0]);
            file1Weight.push(Number(holder[1]));
          }
        } else if (idname == 'secondFile') {
          console.log("found second file");
          for (var i = 0; i < lineNum.length; i++) {
            console.log("loading...");
            file2Words.push(lineNum[i]);
          }
        }
      };
      reader.readAsText(file);
    };

    function compareFiles() {
      console.log("in the compare function");
      if (file1Words.length == 0 || file2Words.length == 0) {
        console.log("why no stuff");
        alert("You must input both files");
        return;
      }
      if (testingFiles) {
        console.log("testing the files");
        display.value = "";
        for (var i = 0; i < file1Words.length; i++) {
          display.value += file1Words[i] + " " + file1Weight[i] + '\n';
        }
        for (var i = 0; i < file2Words.length; i++) {
          display.value += file2Words[i];
        }
      }

      // loop through the arrays
      for (var i = 0; i < file1Words.length; i++) {
        var s1 = file1Words[i];
        for (var j = 0; j < file2Words.length; j++) {
          //console.log(file1Words[i] + " " + file2Words[j]);
          var s2 = file2Words[j];
          console.log(s1 + " " + s2);
          console.log(s1.localeCompare(s2));
          if (s1.localeCompare(s2) == 0) {
            console.log("found something. sending to next func");
          }
        }
      }

    };

    function compareToSaved() {
      console.log("found a match. comparing to see if top 15");
    };
  </script>

</body>

</html>

【问题讨论】:

    标签: javascript arrays string compare equality


    【解决方案1】:

    在第二个单词列表-file2Words中, 最后还添加了一个回车。

    所以第二个 file2Words 总是比 file1Words 多一个字符。

    您可以通过打印两个数组中字符串的长度来检查这一点。 如下图。

    这也将 file2Words 的最后一个字符的 ascii 代码打印为 13(回车)

    for (var i = 0; i < file1Words.length; i++) {
            var s1 = file1Words[i];
            for (var j = 0; j < file2Words.length; j++) {
              //console.log(file1Words[i] + " " + file2Words[j]);
              var s2 = file2Words[j];
    
              console.log(","+s1 + "," + s2 + ",");
              console.log(s1.length)
              console.log(s2.length)
            console.log(s2.charCodeAt(s2.length-1))
    
              console.log(s1.localeCompare(s2));
              if (s1.localeCompare(s2) == 0) {
                console.log("found something. sending to next func");
              }
            }
          }
    
        };
    

    要解决这个问题,请在将单词添加到其他答案中提到的列表之前使用 trim()。

    【讨论】:

      【解决方案2】:

      您需要对每个 LINE 内容执行trim(),然后再将它们推送到数组中。

      var holder = lineNum[i].trim().split(" ");
      file2Words.push(lineNum[i].trim());
      

      var display = document.getElementById("textStuff");
      var file1Words = [];
      var file1Weight = [];
      var file2Words = [];
      var words = [];
      var testingFiles = false;
      
      function loadFile(idname) {
      	console.log("arrived at load function");
      	var file = document.getElementById(idname).files[0];
      	var reader = new FileReader();
      	
      	reader.onload = function (progressEvent) {
      		var lines = this.result.split('\n');
      		
      		if (idname == 'firstFile') {
      			console.log("found the first file");
      			
      			lines.forEach(line => {
      				var values = line.trim().split(" ");
      				file1Words.push(values[0]);
      				file1Weight.push(Number(values[1]));
      			});
      		} else if (idname == 'secondFile') {
      			
      			console.log("found second file");
      			lines.forEach(line => {
      				file2Words.push(line.trim());
      			});
      		}
      	};
      	
      	reader.readAsText(file);
      };
      
      function compareFiles() {
      	console.log("in the compare function");
      	console.log(file1Words, file2Words);
      
      	if (file1Words.length == 0 || file2Words.length == 0) {
      		
      		console.log("why no stuff");
      		alert("You must input both files");
      		return;
      	}
      	if (testingFiles) {
      	
      		console.log("testing the files");
      		display.value = "";
      		file1Words.forEach((element, index) => {
      			display.value += element + " " + file1Weight[index] + '\n';
      		});
      		
      		file2Words.forEach((element, index) => {
      			display.value += element + '\n';
      		});
      	}
      
      	// loop through the arrays
      	for (var i = 0; i < file1Words.length; i++) {
      		var s1 = file1Words[i];
      		for (var j = 0; j < file2Words.length; j++) {
      			var s2 = file2Words[j];
      			var result = s1 === s2;
      			console.log(s1 + " ==? " + s2, result);
      			if (result) {
      				console.log("found something. sending to next func");
      			}
      		}
      	}
      
      };
      
      function compareToSaved() {
      	console.log("found a match. comparing to see if top 15");
      };
      <!-- File:  Enter filename -->
      <!DOCTYPE html>
      
      <html>
      
      <head>
        <meta charset="utf-8">
        <title>Mod D 3: Revenge of the JS</title>
      </head>
      
      <body>
        <input onchange="loadFile(id)" type="file" name="fileName" id="firstFile" accept=".txt">
        <br>
        <input onchange="loadFile(id)" type="file" name="fileName2" id="secondFile" accept=".txt">
        <br>
        <br>
        <button onclick="compareFiles()">compare files</button>
        <br>
        <br>
      
        <textarea readonly name="textStuff" id="textStuff" cols="30" rows="15" style="resize none;" data-role="none"></textarea>
      
      </body>
      
      </html>

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-13
        相关资源
        最近更新 更多