javascript - JavaScript 中如何检查一个数组是否是另一个数组的子集?

标签 javascript arrays

假设我有两个数组,

var PlayerOne = ['B', 'C', 'A', 'D'];
var PlayerTwo = ['D', 'C'];

使用 JavaScript 检查 arrayTwo 是否是 arrayOne 的子集的最佳方法是什么?

原因:我试图理清井字游戏的基本逻辑,结果陷入了困境。无论如何,这是我的代码...非常感谢!

var TicTacToe = {


  PlayerOne: ['D','A', 'B', 'C'],
  PlayerTwo: [],

  WinOptions: {
      WinOne: ['A', 'B', 'C'],
      WinTwo: ['A', 'D', 'G'],
      WinThree: ['G', 'H', 'I'],
      WinFour: ['C', 'F', 'I'],
      WinFive: ['B', 'E', 'H'],
      WinSix: ['D', 'E', 'F'],
      WinSeven: ['A', 'E', 'I'],
      WinEight: ['C', 'E', 'G']
  },

  WinTicTacToe: function(){

    var WinOptions = this.WinOptions;
    var PlayerOne = this.PlayerOne;
    var PlayerTwo = this.PlayerTwo;
    var Win = [];

    for (var key in WinOptions) {
      var EachWinOptions = WinOptions[key];

        for (var i = 0; i < EachWinOptions.length; i++) {
          if (PlayerOne.includes(EachWinOptions[i])) {
            (got stuck here...)
          }

        }
        // if (PlayerOne.length < WinOptions[key]) {
        //   return false;
        // }
        // if (PlayerTwo.length < WinOptions[key]) {
        //   return false;
        // }
        // 
        // if (PlayerOne === WinOptions[key].sort().join()) {
        //   console.log("PlayerOne has Won!");
        // }
        // if (PlayerTwo === WinOptions[key].sort().join()) {
        //   console.log("PlayerTwo has Won!");
        // } (tried this method but it turned out to be the wrong logic.)
    }
  },


};
TicTacToe.WinTicTacToe();

最佳答案

解决方案如下:

使用 ES7(ECMAScript 2016):

const result = PlayerTwo.every(val => PlayerOne.includes(val));

片段:

const PlayerOne = ['B', 'C', 'A', 'D'];
const PlayerTwo = ['D', 'C'];

const result = PlayerTwo.every(val => PlayerOne.includes(val));

console.log(result);

使用 ES5(ECMAScript 2009):

var result = PlayerTwo.every(function(val) {

  return PlayerOne.indexOf(val) >= 0;

});

片段:

var PlayerOne = ['B', 'C', 'A', 'D'];
var PlayerTwo = ['D', 'C'];

var result = PlayerTwo.every(function(val) {

  return PlayerOne.indexOf(val) >= 0;

});

console.log(result);

<小时/>

这是回答下面评论中的问题:

How do we handle duplicates?

解决方案:在上面的解决方案中添加检查数组中足够元素数量的准确条件即可:

const result = PlayerTwo.every(val => PlayerOne.includes(val) 
    && PlayerTwo.filter(el => el === val).length
       <=
       PlayerOne.filter(el => el === val).length
);

第一个案例的片段:

const PlayerOne = ['B', 'C', 'A', 'D'];
const PlayerTwo = ['D', 'C'];

const result = PlayerTwo.every(val => PlayerOne.includes(val) 
    && PlayerTwo.filter(el => el === val).length
       <=
       PlayerOne.filter(el => el === val).length
);

console.log(result);

第二种情况的片段:

const PlayerOne = ['B', 'C', 'A', 'D'];
const PlayerTwo = ['D', 'C', 'C'];

const result = PlayerTwo.every(val => PlayerOne.includes(val) 
    && PlayerTwo.filter(el => el === val).length
       <=
       PlayerOne.filter(el => el === val).length
);

console.log(result);

关于javascript - JavaScript 中如何检查一个数组是否是另一个数组的子集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38811421/

相关文章:

javascript - 为什么 Rx.Observable.of(true) 开始发射

javascript - 当我单击按钮时,数据未更新

javascript - 菜单栏功能无法使用 javascript

javascript - 阻止了原点的帧如何修复

c - 将前导零插入整数

java - 如何让一列的内容向下滑动到我的 7x7 二维数组的底行?

javascript - ES6 Map 或 array : need first, last, previous, next, 在 TypeScript 中获取(混合数组和 Map)

c - 指向数组的指针错误

javascript - 在javascript中获取父级而不修改对象

javascript - jQuery UI 日期选择器 - 类型错误 : O is undefined