JS|判断两个数组是否相等(三种方法)

2,236 阅读2分钟

一、发现问题

力扣844. 比较含退格的字符串

给定 s 和 t 两个字符串,当它们分别被输入到空白的文本编辑器后,如果两者相等,返回 true 。# 代表退格字符。

注意: 如果对空文本输入退格字符,文本继续为空。

在本题中,我选择分别遍历s、t两个字符串, 若当前字符串不为#,就把字符压入数组中, 若当前字符串为#,就从数组中弹出一个字符, 最后比较两个数组的结果是否相等。

以下为原错误解法:

var backspaceCompare = function(s, t) {
    return (output(s) == output(t))//判断两个数组是否相等(错误方法)

};

var output = function(k){
    let arr=[];
    let i=0;
    while(i<=k.length-1){
        if(k.charAt(i) !== '#'){
            arr.push(k.charAt(i));
            i++;
        }else{
            arr.pop();
            i++;
        }
    }
    return arr;
}

测试用例时发现,数组相等,但利用===判断为false

var s = "ac#d"
var t = "ab#d"
console.log(output(s)) //['a', 'd']
console.log(output(t)) //['a', 'd']
console.log(backspaceCompare("ac#d","ab#d")) //false

查询后发现问题如下:

JavaScript里面Array是对象,==或===操作符只能比较两个对象是否是同一个实例,即是否是同一个对象引用。

二、解决问题

判断数组是否相等的方法:

1.简易版:转化为字符串再进行判断。

var a = ['1','2','3']
var b = ['1','2','3']

console.log(a.toString()) //1,2,3
console.log(b.toString()) //1,2,3
console.log(a.toString() === b.toString()) //true

缺点:

1.当数组元素相同,但顺序不同时,判断为false;

var a = ['1','2','3']
var b = ['1','3','2']
console.log(a.toString()) //1,2,3
console.log(b.toString()) //1,3,2
console.log(a.toString() === b.toString()) //false

2.某些特殊情况,如将数字转化为字符串,会判断为true。

var a = [1,2,3]
var b = ['1','2','3']
console.log(a.toString()) //1,2,3
console.log(b.toString()) //1,2,3
console.log(a.toString() === b.toString()) //true

2.进化版

将数组排序后,再转化为字符串,最后进行判断。

var a = [3,2,1]
var b = [1,2,3]
console.log(a.sort().toString()) //1,2,3
console.log(b.sort().toString()) //1,2,3
console.log(a.sort().toString() === b.sort().toString()) //true

3.再进化版

将数组内元素逐个比较

适用于数组内的元素非object类型。

function arrayEqual(a, b) {
    //先将数组排序
    a = a.sort();
    b = b.sort();
    //判断数组长度是否相等,若不相等返回false
    if (a.length != b.length) 
    return false;
    //逐个比较数组元素
    for (var i = 0; i < a.length; ++i) {
        if (a[i] !== b[i]) 
        return false;
    }
    return true;
}

var a = [3,2,1]
var b = [1,2,3]
var c = ['3','2','1']
console.log(arrayEqual(a,b)) //true
console.log(arrayEqual(a,c)) //false