【问题标题】:javascript find duplicate in array errorjavascript在数组错误中找到重复项
【发布时间】:2018-01-12 14:16:46
【问题描述】:

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

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

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

  • dwdw
  • dwdwdwdwdwdwdwdw
  • dwdwdwdw
  • dwdwdwdw
  • dwdwdwdwdwdwdwdwdwdw

我希望只找到一个重复值(第 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
}

【问题讨论】:

  • checkArray 是一个字符串,因此您使用的是返回部分匹配的String#indexOf,而不是只返回完全匹配的Array#indexOf。不过,checkArray 变量确实没有意义。您已经使用值创建了一个对象 - 只需遍历键并查看 obj[key] &gt; 1 是否为。如果是这样,你知道有重复。
  • 我理解你对字符串/数组的解释,但我对如何修改我的代码以使其工作有点迷茫..
  • 查看 Taplar 的解决方案。使用实际的数组,而不是数组的字符串解释。

标签: javascript jquery arrays duplicates


【解决方案1】:

//maybe something like
var inputLines = $('textarea').val().split('\n');
var lineValues = {};

inputLines.forEach(function(line, index){
  if (!lineValues[line]) lineValues[line] = [];
  
  lineValues[line].push(index + 1);
});

Object.keys(lineValues).forEach(function(line){
  if (lineValues[line].length > 1) {
    lineValues[line].forEach(function(value){
      console.log(['Duplicate Value "', line, '":line:', value ].join(''));
    });
  }
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<textarea>
dwdw
dwdwdwdwdwdwdwdw
dwdwdwdw
dwdwdwdw
dwdwdwdwdwdwdwdwdwdw
</textarea>
<div><button>TEST</button></div>

【讨论】:

    【解决方案2】:

    使用 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);
    });
    

    【讨论】:

    • O(n^2) 时间复杂度不是最优的
    • 另外,这个问题的重点不是获取唯一值的列表 - 而是确定哪些值是重复的。
    【解决方案3】:

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

    参考:find duplication in stringtextarea's lines

    var a= [], j= -1, obj = $('textarea').val().split('\n');
    for(var i in obj){
      j= -1;
      while((j= obj.indexOf(obj[i],j+1)) < 1) 
        a.push(i);
    }
    console.log(a)
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
    <textarea rows="4" cols="50">
    ok
    ok.
    nok
    ok
    </textarea>

    【讨论】:

    • 隐式使用带有索引的 Array 对象作为键并在表达式内部使用内联赋值并不是最佳实践。这里是安全的,但作为编写 JavaScript 的一般做法,这种方法是不受欢迎的。
    • @mhodges,不知道是哪里出了问题,能多解释一下吗?
    猜你喜欢
    • 2019-01-02
    • 2013-07-31
    • 2014-08-08
    • 1970-01-01
    • 2014-01-26
    • 1970-01-01
    • 2019-04-28
    • 2017-05-30
    • 2018-05-16
    相关资源
    最近更新 更多