73368


### やりたいこと

配列の中に要素として配列が複数存在していて、  
指定した要素(配列)があるかどうかをtrue, falseで返り値として取得したい。

### 分からないこと

includesやsomeを使用して、試しにtrueが返ってくると思っていたコードを書いたのですが、  
falseが返ってきており、うまく検索できていない理由がわかりません。

[code]

    // someを使用
    const winning_set = [
      ['グー', 'チョキ'],
      ['チョキ', 'パー'],
      ['パー', 'グー']
    ];
    
    const result = ['グー', 'チョキ'];
    
    const i = winning_set.some(
      set => set === result
    );
    console.log(i);
    // => false
    
    
    
    // includesを使用
    const winning_set = [
      ['グー', 'チョキ'],
      ['チョキ', 'パー'],
      ['パー', 'グー']
    ];
    
    const result = ['グー', 'チョキ'];
    
    const i = winning_set.includes(result);
    console.log(i);
    // => false
    
[/code]

falseになる原因がわかるかご存知でしたら、教えていただけると嬉しいです。  
よろしくお願いします。


CC BY-SA 4.0
2021-01-17T04:24:39.543
73359
2021-01-17T13:38:27.697
43337
question
javascript
配列の中にある要素が配列の場合、特定の要素(配列)があるかどうかを判定したい


配列同士を直接比較する方法はないようです。  
配列を文字列に変換してから比較すると「やりたいこと」に近いことはできます。

[code]

    const winning_set = [
      ['グー', 'チョキ'],
      ['チョキ', 'パー'],
      ['パー', 'グー']
    ];
    
    const result = ['グー', 'チョキ'];
    
    const i = winning_set.some(
      item => item.toString() == result.toString()
    );
    console.log(i);
    // => true
    
[/code]

区切り記号(,)と同じ値が含まれる場合、誤認する場合がありますので工夫が必要です。  
汎用的な配列比較は難しいです。JSONに変換し、JSONのライブラリを使用するのも一案かと思います。  
次の例では`[',', ',,']`と`[',,', ',']`を同一視してしまいます。

[code]

    const winning_set = [
      [',', ',,'],
      ['グー', 'チョキ'],
      ['チョキ', 'パー'],
      ['パー', 'グー']
    ];
    
    const result = [',,', ','];
    
    const i = winning_set.some(
      item => item.toString() == result.toString()
    );
    console.log(i);  //trueと誤認
    
[/code]


CC BY-SA 4.0
2021-01-17T13:38:27.697
73368
2021-01-17T13:38:27.697
35558
73359
answer