45

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なぜこれほど単純なことを行うのが非常に難しいのかを単に宣言するよりも優れています。これを機能させるためのアイデアはありますか?

4

8 に答える 8

45

一般的に言って、JavaScriptには実際には連想配列がないため、これは代わりにオブジェクトを使用する方が適切です。

var foo = { bar: 0 };

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

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

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

于 2012-05-25T15:51:45.783 に答える
38
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);
});

ただし、すべての値が単純かつ一意に文字列として表現できる場合は、配列ではなくオブジェクトを使用して、速度を大幅に向上させる必要があります(@JonathanSampsonの回答で説明されています)。

于 2012-05-25T15:52:03.413 に答える
22

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

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}
于 2019-03-05T09:36:51.163 に答える
2

すでにスプレッドを使用している場合...

let colors = ['red', 'orange', 'yellow'];
let moreColors = ['orange', 'green'];

let mergedColors = [...colors, ...moreColors];

重複を避けたい...

let mergedColors = [...colors, ...moreColors.filter(c => !colors.includes(c)) ];
于 2021-06-09T21:39:22.603 に答える
1

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

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配列で重複する値を見つける最も簡単な方法

于 2017-01-11T12:57:47.237 に答える
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

キー(または配列のインデックス)の存在を確認するためにループする理由はありません。さて、価値観は別の話です...

ハッピーコーディング

于 2012-05-25T15:52:26.593 に答える
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
于 2016-01-04T17:11:26.643 に答える
-1

let x = "farceus";
let y = "character";

const commonCharacters = function (string1, string2) {
  let duplicateCharacter = "";
  for (let i = 0; i < string1.length; i += 1) {
    if (duplicateCharacter.indexOf(string1[i]) === -1) {
      if (string2.indexOf(string1[i]) !== -1) {
        duplicateCharacter += string1[i];
      }
    }
  }
  return [...duplicateCharacter];
};


console.log(commonCharacters(x, y));

于 2021-11-01T17:18:10.590 に答える