2017-08-04 6 views
0

私は次の結果を達成しようとしています。 私はテキストエリアを持っています、このテキストエリア内に入力されるすべてのテキストを(行単位で)配列に変換したいと思います。テキストが入力されたら、エントリに重複があるかどうか確認したい。javascriptが配列エラーで重複を見つける

は、これを行うために、I: 1)TEXTAREA 2)私は重複がすべての値を介して 3)Iループ値)以下checkArrayという名前の配列を(作成から以下の配列(名前myarrayfromtextareaを)作成私の最初の配列では、私は2番目の配列の一致を確認します。

理論的には、それがうまく動作しますが、私は、テキストエリアに入力し、次の値を試してみました:

  • dwdw
  • dwdwdwdwdwdwdwdw
  • dwdwdwdw
  • dwdwdwdw

dwdwdwdwdwdwdwdwdwdw私は1つの重複を見つけることを期待した(行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 
} 
+1

'checkArray'が文字列であるので、あなたがアレイ#のindexOf'とは反対に、部分的な一致を返す '文字列#indexOf'を使用しています'これは正確な一致を返すだけです。しかし、実際には 'checkArray'変数には何の指摘もありません。値を持つオブジェクトを既に作成しています。キーを繰り返して、 'obj [key]> 1'があるかどうかを確認してください。そうであれば、重複があることを知っています。 – mhodges

+0

文字列/配列についてのあなたの説明を理解していますが、コードを変更して動作させる方法が少し失われています。 –

+0

Taplarの解説を参照してください。配列の文字列解釈ではなく、実際の配列を使用します。 – mhodges

答えて

3

//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>

0

クイックと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); 
}); 
+0

'O(n^2)'時間の複雑さが最適以下 – mhodges

+0

また、この質問のポイントは一意の値のリストを取得することではなく、重複する値を特定することです。 – mhodges

0

このコードは、すべての重複したインデックスを返します!

REF: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>

+0

インデックスとしてキーを指定してArrayオブジェクトを暗黙的に使用し、式の内部でインライン割り付けを使用するのは、ベストプラクティスではありません。ここでは安全ですが、JavaScriptを書く一般的なプラクティスとして、このアプローチは面倒です。 – mhodges

+0

@mhodges、どこに問題があるかもわかりません、もっと説明できますか? – easa

関連する問題