📌  相关文章
📜  检查一个数组是否是另一个数组的子数组(1)

📅  最后修改于: 2023-12-03 14:55:43.478000             🧑  作者: Mango

检查一个数组是否是另一个数组的子数组

当我们处理数组时,有时候需要检查一个数组是否是另一个数组的子数组。下面介绍几种实现方法。

方法一:使用 indexOf() 方法

JavaScript 中的数组有一个 indexOf() 方法,该方法返回数组中指定元素的第一个出现位置的索引。如果数组中不存在该元素,则返回 -1。因此,我们可以使用该方法来检查一个数组是否是另一个数组的子数组。

const arr1 = [1, 2, 3, 4, 5];
const arr2 = [2, 3];
const arr3 = [6, 7];

console.log(arr1.indexOf(arr2[0])); // 输出 1
console.log(arr1.indexOf(arr2[1])); // 输出 2
console.log(arr1.indexOf(arr3[0])); // 输出 -1

if (arr2.every(item => arr1.indexOf(item) !== -1)) {
  console.log('arr2 是 arr1 的子数组');
} else {
  console.log('arr2 不是 arr1 的子数组');
}
if (arr3.every(item => arr1.indexOf(item) !== -1)) {
  console.log('arr3 是 arr1 的子数组');
} else {
  console.log('arr3 不是 arr1 的子数组');
}

以上代码输出结果为:

1
2
-1
arr2 是 arr1 的子数组
arr3 不是 arr1 的子数组

代码解释:

  • 首先,我们定义了三个数组:arr1、arr2 和 arr3。
  • 接下来,我们使用 indexOf() 方法检查 arr2 和 arr3 是否是 arr1 的子数组。可以看到,arr2 是 arr1 的子数组,而 arr3 不是 arr1 的子数组。
  • 我们使用了数组的 every() 方法,该方法用于检查数组中的所有元素是否都满足某个条件。我们传入一个回调函数,该函数会在每次迭代时执行。回调函数的参数 item 表示当前正在迭代的元素,而箭头函数的返回值表示该元素是否符合要求。如果每个元素都满足要求,则返回 true;否则返回 false。在以上代码中,我们传入了一个回调函数来检查 arr1 中是否包含 arr2 或 arr3 中的每个元素。如果所有元素都包含在 arr1 中,则 arr2 或 arr3 是 arr1 的子数组。
方法二:使用 includes() 方法

ES2016 引入了一个新的数组方法 includes(),该方法返回一个布尔值,表示数组是否包含指定的值。我们可以使用 includes() 方法来检查一个数组是否是另一个数组的子数组。

const arr1 = [1, 2, 3, 4, 5];
const arr2 = [2, 3];
const arr3 = [6, 7];

if (arr2.every(item => arr1.includes(item))) {
  console.log('arr2 是 arr1 的子数组');
} else {
  console.log('arr2 不是 arr1 的子数组');
}
if (arr3.every(item => arr1.includes(item))) {
  console.log('arr3 是 arr1 的子数组');
} else {
  console.log('arr3 不是 arr1 的子数组');
}

以上代码输出结果与前面相同。

代码解释:

  • 我们使用 includes() 方法来检查 arr2 和 arr3 是否是 arr1 的子数组。
  • 与前面的方法类似,我们使用了数组的 every() 方法来检查 arr1 中是否包含 arr2 或 arr3 中的每个元素。
方法三:使用 filter() 方法

filter() 方法可以根据某个条件过滤数组中的元素,并返回一个新的数组。我们可以使用 filter() 方法将 arr1 中不包含在 arr2 或 arr3 中的元素过滤出来,然后检查剩余的元素是否连续排列。

const arr1 = [1, 2, 3, 4, 5];
const arr2 = [2, 3];
const arr3 = [6, 7];

const checkSubArray = (arr1, arr2) => {
  const diffArr = arr1.filter(item => !arr2.includes(item));
  const len = diffArr.length;
  const start = arr1.indexOf(diffArr[0]);
  const end = arr1.indexOf(diffArr[len - 1]);
  const subArr = arr1.slice(start, end + 1);
  if (subArr.length === len && subArr.every((item, index) => item === diffArr[index])) {
    return true;
  } else {
    return false;
  }
};

console.log(checkSubArray(arr1, arr2)); // 输出 true
console.log(checkSubArray(arr1, arr3)); // 输出 false

代码解释:

  • 首先,我们定义了一个 checkSubArray() 函数,该函数接受两个参数 arr1 和 arr2。
  • 在函数内部,我们使用 filter() 方法过滤掉 arr1 中包含在 arr2 中的元素,得到一个新的数组 diffArr。
  • 我们将 diffArr 的长度和 arr1、subArr 的起止索引进行比较,如果它们的长度相等且元素相同,则说明 subArr 是 arr1 的子数组,返回 true;否则返回 false。