javascript在数组中发现重复错误

javascript在数组中发现重复错误,javascript,jquery,arrays,duplicates,Javascript,Jquery,Arrays,Duplicates,我正在努力实现以下结果。 我有一个textarea,我想将所有文本(按行)转换为数组中该textarea内输入的文本。输入文本后,我想检查条目中是否有重复项 为此,我: 1) 从textarea创建一个数组(名为myarrayfromtextarea,如下所示) 2) 我创建了一个重复值的数组(下面名为checkArray) 3) 我循环遍历第一个数组中的所有值,并检查第二个数组中的匹配项 理论上,它工作得很好,但我尝试在textarea中输入以下值: dwdw dwdwdwdwdwdw dw

我正在努力实现以下结果。 我有一个textarea,我想将所有文本(按行)转换为数组中该textarea内输入的文本。输入文本后,我想检查条目中是否有重复项

为此,我: 1) 从textarea创建一个数组(名为myarrayfromtextarea,如下所示) 2) 我创建了一个重复值的数组(下面名为checkArray) 3) 我循环遍历第一个数组中的所有值,并检查第二个数组中的匹配项

理论上,它工作得很好,但我尝试在textarea中输入以下值:

  • dwdw
  • dwdwdwdwdwdw
  • dwdwdw
  • dwdwdw
  • dwdwdwdwdwdwdwdw
我希望只找到一个重复值(第3行和第4行),但令人难以置信的是,当我运行-->checkArray.indexOf(array[I])时,第1行也显示了匹配项

你能帮我吗

var myarrayfromtextarea = $('#My_textarea').val().split('\n'); // create array from textarea
console.log("array from textarea: " + myarrayfromtextarea)


var myArr = myarrayfromtextarea; /// here I start to find duplicates
var obj = {};
var checkArray = "["
myArr.forEach(function(item) {
    if (typeof obj[item] == 'number') {
        checkArray = checkArray + item + ",";
        obj[item]++;

    } else {
        obj[item] = 1;
    }
});

checkarraylenght = (checkArray.length - 1)
checkArray = checkArray.substring(0, checkarraylenght)


checkArray = checkArray + "]" + '';
console.log("checkarray = " + checkArray)

myarrayfromtextarea = myarrayfromtextarea + '';
var array = myarrayfromtextarea.split(',');

var arrayLength = array.length;
for (var i = 0; i < arrayLength; i++) {

    if (checkArray.indexOf(array[i]) == -1) {
        console.log("Not a duplicate: " + array[i]);
    } else {

        console.log("Duplicate value: " + array[i]);
    }
    //Do something
}
var myarrayfromtextarea=$(“#我的文本区域”).val().split(“\n”);//从textarea创建数组
log(“来自textarea的数组:”+myarrayfromtextarea)
var myArr=myarrayfromtextarea;//在这里,我开始寻找重复的
var obj={};
var checkArray=“[”
myArr.forEach(功能(项目){
if(对象类型[项目]=“编号”){
checkArray=checkArray+item+“,”;
obj[项目]+;
}否则{
obj[项目]=1;
}
});
checkarraylenght=(checkArray.length-1)
checkArray=checkArray.substring(0,checkarraylenght)
checkArray=checkArray+“]”“+”;
console.log(“checkarray=“+checkarray”)
myarrayfromtextarea=myarrayfromtextarea+“”;
var array=myarrayfromtextarea.split(',');
var arrayLength=array.length;
对于(变量i=0;i
使用jQuery快速而肮脏:

var names = ["Mike","Matt","Nancy","Adam","Jenny","Nancy","Carl"];
var uniqueNames = [];
$.each(names, function(i, el){
    if($.inArray(el, uniqueNames) === -1) uniqueNames.push(el);
});

使用jQuery快速且肮脏:

var names = ["Mike","Matt","Nancy","Adam","Jenny","Nancy","Carl"];
var uniqueNames = [];
$.each(names, function(i, el){
    if($.inArray(el, uniqueNames) === -1) uniqueNames.push(el);
});
//可能是这样的
var inputLines=$('textarea').val().split('\n');
var lineValues={};
forEach(函数(行、索引){
如果(!lineValues[line])lineValues[line]=[];
lineValues[line].push(索引+1);
});
Object.key(lineValues).forEach(function(line){
if(lineValues[line].length>1){
lineValues[line].forEach(函数(值){
console.log(['Duplicate Value',line',':line:',Value].join('');
});
}
});

dwdw
dwdwdwdwdwdw
dwdwdw
dwdwdw
dwdwdwdwdwdwdwdw
测试
//可能是这样的
var inputLines=$('textarea').val().split('\n');
var lineValues={};
forEach(函数(行、索引){
如果(!lineValues[line])lineValues[line]=[];
lineValues[line].push(索引+1);
});
Object.key(lineValues).forEach(function(line){
if(lineValues[line].length>1){
lineValues[line].forEach(函数(值){
console.log(['Duplicate Value',line',':line:',Value].join('');
});
}
});

dwdw
dwdwdwdwdwdw
dwdwdw
dwdwdw
DWDWDWDWDWDWDW

TEST
此代码返回所有重复的索引

参考:

var a=[],j=-1,obj=$('textarea').val().split('\n');
用于(obj中的var i){
j=-1;
而((j=obj.indexOf(obj[i],j+1))<1)
a、 推(i);
}
console.log(a)

好啊
好啊
诺克
好啊

此代码返回所有重复的索引

参考:

var a=[],j=-1,obj=$('textarea').val().split('\n');
用于(obj中的var i){
j=-1;
而((j=obj.indexOf(obj[i],j+1))<1)
a、 推(i);
}
console.log(a)

好啊
好啊
诺克
好啊

checkArray
是一个字符串,因此您使用的是返回部分匹配的
string#indexOf
,而不是只返回精确匹配的
Array#indexOf
。不过,
checkArray
变量中实际上没有任何意义。您已经用这些值创建了一个对象-只需在键上迭代,看看
obj[key]>1
。如果是这样的话,您知道存在重复项。我理解您对字符串/数组的解释,但我对如何修改代码以使其工作有点不知所措。请参阅Taplar的解决方案。使用实际数组,而不是数组的字符串解释。
checkArray
是一个字符串,因此您使用的是返回部分匹配的
string#indexOf
,而不是只返回精确匹配的
Array#indexOf
。不过,
checkArray
变量中实际上没有任何意义。您已经用这些值创建了一个对象-只需在键上迭代,看看
obj[key]>1
。如果是这样的话,您知道存在重复项。我理解您对字符串/数组的解释,但我对如何修改代码以使其工作有点不知所措。请参阅Taplar的解决方案。使用实际数组,而不是数组的字符串解释。
O(n^2)
时间复杂度小于最佳值。此外,这个问题的重点不是获取唯一值的列表,而是确定哪些值是重复的。
O(n^2)
时间复杂度也小于最佳值,这个问题的重点不是获取唯一值的列表,而是确定哪些值是重复的。隐式使用带有索引的数组对象作为键,并在表达式内部使用内联赋值,这并不是最佳做法。在这里是安全的,但作为编写JavaScript的一般实践,这种方法是不可取的。@mhodges,我不知道它可能有问题,请您进一步解释一下好吗?隐式使用带有索引的数组对象作为键并在表达式内使用内联赋值并不完全是最佳实践。在这里是安全的,但作为编写JavaScript的一般实践,这种方法是不受欢迎的。@mhodges,我不知道它在哪里可能会有问题,请你解释一下好吗?