web-dev-qa-db-ja.com

重複キーがjavascript配列に追加されるのを防ぐ方法

For ... inループについて話し、hasOwnPropertyを使用した回答を含む関連する質問をたくさん見つけましたが、何も正しく動作しません。配列にキーが存在するかどうかを確認し、存在しない場合は追加するだけです。

空の配列から始めて、ページが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なぜそんなに単純なことがとても難しいのか。この作品を作るためのアイデアはありますか?

31
iamsar

JavaScriptは実際には連想配列を持たないため、一般的に言えば、オブジェクトを使用する方が適切です。

var foo = { bar: 0 };

次に、inを使用してキーを確認します。

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

以下のコメントで正しく指摘されているように、このメソッドは便利ですonlyキーが文字列、または文字列(数字など)として表現できるアイテムになる場合。

38
Sampson
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]

詳細については Array.indexOf

JQueryに依存する場合は、代わりに jQuery.inArray

$.each(b,function(value){
  if ($.inArray(value,a)==-1) a.Push(value);
});

すべての値が文字列として単純かつ一意に表現できる場合、ただし、潜在的にmassive速度の増加(@JonathanSampsonによる回答で説明)。

29
Phrogz

ES6では、Setsを使用したより良い代替手段が提供されています。そのため、配列を宣言する代わりに、重複を追加しない配列が必要な場合は、Setを使用することをお勧めします。

var array = new Set();
array.add(1);
array.add(2);
array.add(3);

console.log(array);
// Prints: Set(3) {1, 2, 3}

array.add(2); // does not add any new element

console.log(array);
// Still Prints: Set(3) {1, 2, 3}
2
Pavan

これを試すことができます:

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

JavaScript配列で重複する値を見つける最も簡単な方法

1
Bruno Pinna
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
abhiagNitk

論理が間違っています。このことを考慮:

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

key(または配列のindices)の存在を確認するためにループする理由はありません。現在、は別の話です...

ハッピーコーディング

0
user166390