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
なぜそんなに単純なことがとても難しいのか。この作品を作るためのアイデアはありますか?
JavaScriptは実際には連想配列を持たないため、一般的に言えば、オブジェクトを使用する方が適切です。
var foo = { bar: 0 };
次に、in
を使用してキーを確認します。
if ( !( 'bar' in foo ) ) {
foo['bar'] = 42;
}
以下のコメントで正しく指摘されているように、このメソッドは便利ですonlyキーが文字列、または文字列(数字など)として表現できるアイテムになる場合。
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による回答で説明)。
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}
これを試すことができます:
var names = ["Mike","Matt","Nancy","Adam","Jenny","Nancy","Carl"];
var uniqueNames = [];
$.each(names, function(i, el){
if($.inArray(el, uniqueNames) === -1) uniqueNames.Push(el);
});
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
論理が間違っています。このことを考慮:
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)の存在を確認するためにループする理由はありません。現在、値は別の話です...
ハッピーコーディング