2012-05-25 4 views
22

私は多くの関連する質問を見つけました。答えは... forループとhasOwnPropertyを使用していますが、私は正しく動作しません。私がしたいのは、キーが配列内に存在するかどうかをチェックし、そうでなければそれを追加することだけです。javascript配列に重複するキーを追加しないようにする方法

空の配列から始めて、ページがjQueryでスクラブされるときにキーを追加します。 (一般的な名前を使用して)

if (!array[key]) 
    array[key] = value; 

ノー行く:

当初、私は次のような単純な何かがうまくいくことを期待しました。それをフォローアップ:

for (var in array) { 
    if (!array.hasOwnProperty(var)) 
     array[key] = value; 
} 

も試してみました:これの

if (array.hasOwnProperty(key) == false) 
    array[key] = value; 

どれも働いていません。何も配列にプッシュされていないか、私が試したことは単に宣言する以上に良いことではありませんarray[key] = valueなぜそれほど簡単ではないのですか?この作品を作るためのあらゆるアイデア?

+3

あなたは 'Array'または' Object'を試していますか? – thecodeparadox

+0

ES6はネイティブ – Efren

答えて

32

一般的にはJavaScriptが本当に連想配列を持っていないので、これは代わりに、オブジェクトとのより良い実現され、スピーキング:

var foo = { bar: 0 }; 

次にキーを確認するためにinを使用します。

if (!('bar' in foo)) { 
    foo['bar'] = 42; 
} 

だったので以下のコメントで正しく指摘されているように、このメソッドは、キーが文字列である場合は、文字列(数字など)で表現できる場合は便利です。 Array.indexOfをよく読んで詳細については

+2

の[Set](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set)を持っています...あなたの値が文字列か一意の文字列として表現可能であると仮定します(これには数字も含まれます)。 – Phrogz

+0

@Phrogz絶対に。 OPへのアドバイスの良いビット。 – Sampson

+3

ありがとうジョナサン。ライトは私が間違っていたことを最終的にクリックした。あなたの答えが助けになったとは言いませんでしたが、ちょっとした探偵作業の後、私はそれが完璧に機能すると言ってうれしく思います。オブジェクトのヒントをありがとう。私はその道を念頭に置いておくつもりだ。 – iamsar

21
var a = [1,2,3], b = [4,1,5,2]; 

b.forEach(function(value){ 
    if (a.indexOf(value)==-1) a.push(value); 
}); 

console.log(a); 
// [1, 2, 3, 4, 5] 

あなたはjQueryのに依存する場合、代わりに使用jQuery.inArray

すべての値は、単純に一意の文字列として表現されますが、配列の代わりにオブジェクトを使用する必要がある場合は

$.each(b,function(value){ 
    if ($.inArray(value,a)==-1) a.push(value); 
}); 
、潜在的には の大規模なのスピードの増加(@JonathanSampsonの答えに記述されているように)。

+0

また、 'indexOf'を使うことの問題は、それ自体がループを作ることです...これは、[Schlemielの画家のアルゴリズム](http://en.wikichip.org/wiki/Schlemiel_the_Painter's_Algorithm)が遅くなりますすべての項目が配列に追加されます。 –

0

ロジックが間違っています。このことを考えてみます(配列の場合または指数キー存在を確認するためにループする理由はありません

x = ["a","b","c"] 
x[0]  // "a" 
x["0"] // "a" 
0 in x // true 
"0" in x // true 
x.hasOwnProperty(0) // true 
x.hasOwnProperty("0") // true 

。今、は別の話です...

ハッピーコーディング

0
function check (list){ 
    var foundRepeatingValue = false; 
    var newList = []; 
    for(i=0;i<list.length;i++){ 
     var thisValue = list[i]; 
     if(i>0){ 
      if(newList.indexOf(thisValue)>-1){ 
       foundRepeatingValue = true; 
       console.log("getting repeated"); 
       return true; 
      } 
     } newList.push(thisValue); 
    } return false; 
} 

 

var list1 = ["dse","dfg","dse"]; 
check(list1); 

出力:

getting repeated 
true 
0

あなたはこれを試すことができます。

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

Easiest way to find duplicate values in a JavaScript array

関連する問題