js 判断一个数组是否以另一个数组结束

js 判断一个数组是否以另一个数组结束
二次蓝 Lv4

想法以及测试

现在需要一个函数,判断一个小数组是不是在另一个大数组的末尾,或者说大数组是否包含了小数组,并且是以小数组结束的。然后返回小数组在大数组中的起始索引(其实就是在末尾了,大减小)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
// 第一种方法:将数组转为字符串,用正则验证
function isInLast(smallArr, bigArr) {
const smallStr = smallArr.toString();
const bigStr = bigArr.toString();

const reg = new RegExp(smallStr + "$");
if (!reg.test(bigStr)) return -1;

return bigArr.length - smallArr.length;
}

// 第二种方法:翻转一下数组,以小数组为基准,从0开始进行遍历验证
function isInLast2(smallArr, bigArr) {
smallArr.reverse();
bigArr.reverse();

for (let i = 0; i < smallArr.length; i++) {
if (smallArr[i] != bigArr[i]) return -1;
}

smallArr.reverse();
bigArr.reverse();
return bigArr.length - smallArr.length;
}

// 第三种方法:第二种方法的稍微变形,不翻转数组
function isInLast3(smallArr, bigArr) {
const diff = bigArr.length - smallArr.length;
for (let i = 0; i < smallArr.length; i++) {
if (smallArr[i] != bigArr[diff + i]) return -1;
}

return diff ;
}

var a = [1, 2, 3, 1, 4, 1,3, 1, 4, 1,3, 1, 4, 1,3, 1, 4, 1,3, 1, 4, 1,3, 1, 4, 1,3, 1, 4, 1,3, 1, 4, 1,3, 1, 4, 1,3, 1, 4, 1,3, 1, 4, 1,3, 1, 4, 1,3, 1, 4, 1,3, 1, 4, 1,3, 1, 4, 1,3, 1, 4, 1,3, 1, 4, 1,3, 1, 4, 1,3, 1, 4, 1,3, 1, 4, 1,3, 1, 4, 1,3, 1, 4, 1,3, 1, 4, 1,3, 1, 4, 1,3, 1, 4, 1,3, 1, 4, 1,3, 1, 4, 1,3, 1, 4, 1,3, 1, 4, 1,3, 1, 4, 1,3, 1, 4, 1,3, 1, 4, 1,3, 1, 4, 1,3, 1, 4, 1,3, 1, 4, 1,3, 1, 4, 1,3, 1, 4, 1,3, 1, 4, 1, 2, 3];
var b = [1, 2, 3];

// 测试
console.log("isInLast", isInLast(b, a));
console.log("isInLast2", isInLast2(b, a));
console.log("isInLast3", isInLast3(b, a));

// 效率测试
var testNum = 1000000;
console.time('test-isInLast');
for (let i = 0; i < testNum; i++) {
isInLast(b, a);
}
console.timeEnd('test-isInLast');
console.time('test-isInLast2');
for (let i = 0; i < testNum; i++) {
isInLast2(b, a);
}
console.timeEnd('test-isInLast2');
console.time('test-isInLast3');
for (let i = 0; i < testNum; i++) {
isInLast2(b, a);
}
console.timeEnd('test-isInLast3');

结果:

看来还是遍历的效率高,而且方法二、三不分伯仲。

也测试过使用 slice() 复制数组而不进行两次 reverse(),发现两次 reverse() 效率明显更高。

最后我可以实现我的最终目的,输入两个数组,以对象的形式返回是否包含、切割后的两个数组。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
// 判断一个数组是否以另一个数组结束,包含的话:返回较小数组在较大数组中对应的起始索引
// hasSorted:判断输入的参数数组顺序是否已经按照从小数组到大数组排序(大小指长度)
function isInLast(firArr, secArr) {
let diff = secArr.length - firArr.length;

let bigArr, smallArr, hasSorted;
if (diff >= 0) {
bigArr = secArr;
smallArr = firArr;
hasSorted = true;
} else {
diff = -diff;
bigArr = firArr;
smallArr = secArr;
hasSorted = false;
}

for (let i = 0; i < smallArr.length; i++) {
if (smallArr[i] != bigArr[diff + i]) return { isContain: false };
}

return {
isContain: true,
hasSorted: hasSorted,
diff: diff
};
}
  • 标题: js 判断一个数组是否以另一个数组结束
  • 作者: 二次蓝
  • 创建于 : 2021-04-03 13:35:03
  • 更新于 : 2021-04-05 10:54:00
  • 链接: https://blog.ercilan.cn/2021/04/03/js-判断一个数组是否以另一个数组结束/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论
目录
js 判断一个数组是否以另一个数组结束