📅  最后修改于: 2023-12-03 14:55:43.478000             🧑  作者: Mango
当我们处理数组时,有时候需要检查一个数组是否是另一个数组的子数组。下面介绍几种实现方法。
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 的子数组
代码解释:
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 的子数组');
}
以上代码输出结果与前面相同。
代码解释:
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
代码解释: