javascript比较对象数组

javascript比较对象数组,javascript,compare,Javascript,Compare,我得到了一个“超过了最大调用堆栈大小”。当我尝试迭代数组的内容时,我一辈子都不知道为什么 编辑:顺便说一下,我想补充一句,这是为Safari设计的 下面是函数: function compareObj(a,b) { var u = function(c,d) {//Check types var type = Object.prototype.toString.call(a) if (type !== Object.prototype.toString.call(b)) ret

我得到了一个“超过了最大调用堆栈大小”。当我尝试迭代数组的内容时,我一辈子都不知道为什么 编辑:顺便说一下,我想补充一句,这是为Safari设计的

下面是函数:

function compareObj(a,b) {
var u = function(c,d) {//Check types
    var type = Object.prototype.toString.call(a)

    if (type !== Object.prototype.toString.call(b)) return false

    return type.slice(8,-1) == 'Array' ? v(a,b) : type.slice(8,-1) == 'Object' ?  w(a,b) :
           type.slice(8,-1) == 'String' ? x(a,b) : type.slice(8,-1) == 'Number' ? y(a,b) :
           type.slice(8,-1) == 'Boolean' ? z(a,b) : false ;
}

var v = function(c,d) {//Array
    if (c.length !== d.length) return false
    /*for (var i = 0; i < c.length; i++) {
        if (!u(c[i],d[i])) {
            return false
        }
    }*/
    while (c.length) {
        if (!u(c[0],d[0])) {
            return false
        } else {
            c.shift();
            d.shift();
        }
    }
    return true
}

var w = function(c,d) {//Object
    for (i in c) {

    }
    return true
}

var x = function(c,d) {//String
    return c === d
}

var y = function(c,d) {//Number
    return c === d
}

var z = function(c,d) {//Boolean
    return c === d
}

return u(a,b)
}
函数比较bj(a,b){
var u=函数(c,d){//检查类型
var type=Object.prototype.toString.call(a)
if(type!==Object.prototype.toString.call(b))返回false
返回类型.slice(8,-1)==“Array”?v(a,b):类型.slice(8,-1)==“Object”?w(a,b):
类型.切片(8,-1)=“字符串”?x(a,b):类型.切片(8,-1)=“数字”?y(a,b):
类型切片(8,-1)=‘布尔’?z(a,b):假;
}
var v=函数(c,d){//数组
如果(c.length!==d.length)返回false
/*对于(变量i=0;i

我在u()函数的return语句中得到了重载

您的函数可以短得多。建议使用有意义的完整函数名。有些功能是多余的。不需要递归。我冒昧地重写了你的函数,只是为了演示一下。你可以看到

实际上,如果您使用JSON(在较新的浏览器中是本机的,或者从库中),您只需使用:

function compare(a,b){
  return JSON.stringify(a) === JSON.stringify(b);
}

不确定为什么会出现过载,但为什么会有3个相同的函数
x
y
z
?我只是在布置它,还没有完全清理它,因为我被这个愚蠢的堆栈大小错误卡住了一半,我看到
compareObj([1,2,3],[1,2,3])=>在JSFIDLE中为false
。奇怪!事实上,所有的结果都是假的。这是正确的页面吗?@Jiri:您正在使用IE。IE从
[someobj].constructor.name返回
未定义的
。我更新了小提琴来纠正这个错误。@Kooilnc:是的,现在可以了(+1)。我正在使用IE8。@Jiri:谢谢你提醒我总是在IE:P中检查我的代码
function compare(a,b){
  return JSON.stringify(a) === JSON.stringify(b);
}