找到所有重复的行并显示不匹配

时间:2014-11-04 06:43:51

标签: javascript arrays

在javascript中有一种简单的方法吗?

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

output = ["green", "yellow"]

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

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

需要在至少4000个值上运行此操作,不确定更快,正则表达式或数组函数是什么?

感谢您的帮助。

代码有问题: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);
&#13;
&#13;
&#13;

2 个答案:

答案 0 :(得分:0)

如果唯一元素的顺序无关紧要,您可以将项目存储在对象中并递增计数,如下所示

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关键字声明变量,它们将成为全局属性。

答案 1 :(得分:0)

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();

我唯一不理解的是为什么页面在完成整个文件的处理后会继续尝试加载。