查找所有重复行并显示不匹配项

Find all duplicate lines and display non matches

本文关键字:显示 不匹配 查找      更新时间:2023-09-26

在javascript中有一种简单的方法可以做到这一点吗?

arr = ["red","blue","green","red","blue", "yellow"]
output = ["green", "yellow"]

基本上,如果一个值在数组中只显示一次,则输出它。顺序是随机的。

在php中有一些简单的方法可以做到这一点,javascript让我很困惑

需要在至少4000个值上运行此操作,不确定regex或数组函数的速度更快?

谢谢你的帮助。

代码有问题:myarrs值在函数外无法访问,我被困在那里了。文件以其他方式加载,

var txt = '';
var myarr = '';
var xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function(){
  if(xmlhttp.status == 0 && xmlhttp.readyState == 4){
   txt = xmlhttp.responseText;  
   myarr = txt.split("'n");
});
//alert(myarr.length);
      
xmlhttp.open("GET","list.csv",true);
xmlhttp.send();
var map = new Object();
for(var i = 0; i < myarr.length; i++)
{
    if(map[myarr[i]] === undefined)
    {map[myarr[i]] = 1; }
    else
    {map[myarr[i]]++; }
}
var result = new Array();
for(var i = 0; i < myarr.length; i++)
{   
    if(map[myarr[i]] > 1)
    { //do nothing
	}
    else
    {result.push(myarr[i]);}
}
console.debug(result);
document.write(result);

如果唯一元素的顺序无关紧要,您可以将项目存储在对象中并增加计数,就像这个

var arr = ["red", "blue", "green", "red", "blue", "yellow"], obj = {};
arr.forEach(function(currentItem) {
    obj[currentItem] = (obj[currentItem] || 0) + 1;
});

然后过滤掉所有值不为1的项目,以获得唯一值

var unique = Object.keys(obj).filter(function(currentItem) {
    return obj[currentItem] === 1;
});
console.log(unique);
# [ 'green', 'yellow' ]

注意:如果不使用var关键字声明变量,它们将成为全局属性。

var txt = '';
var xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function(){
  //for local files use status zero not 200
  if(xmlhttp.status == 0 && xmlhttp.readyState == 4){
    txt = xmlhttp.responseText;
   myarr = txt.split("'n");
  display = myarr.filter(function(a,b,c){return c.indexOf(a)===c.lastIndexOf(a);});
   document.write(display);
   // myarr.replace(",", "<br>");
   }
};
xmlhttp.open("GET","list.csv",true);
xmlhttp.send();

我唯一不明白的是,为什么页面在处理完整个文件后仍在尝试加载。