javascript比较对象数组

标签 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)) 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)
}

我在 u() 函数的返回语句中得到重载

最佳答案

您的函数可以短很多。建议使用有意义的函数名称。有些功能是多余的。不需要递归。我冒昧地重写了你的功能,只是为了演示。可以看看in action here .

function compareObj(a,b) {
var doCompare = function(c,d) {
    //Check types (IE compatible)
    var objRE = /Array|Object|String|Number|Boolean/,
        aType = a.constructor.name || String(a.constructor).match(objRE)[0],
        bType = b.constructor.name || String(b.constructor).match(objRE)[0];

    //Types different? No dice.
    if (aType !== bType) {return false;}

    switch(aType){
        case 'Array'  : return arrayCompare(a,b); break;
        case 'Object' : return objectCompare(a,b); break;
        case 'String' : return valueCompare(a,b); break;     
        case 'Number' : return valueCompare(a,b); break;
        case 'Boolean': return valueCompare(a,b); break;
       default: return false
    }
   }

  var arrayCompare = function(c,d) { //Array
      if (c.length !== d.length) {return false;}
      var i = c.length;
      while (--i) {
        if ( !valueCompare(c[i],d[i]) ) {
            return false;
        }
      }
    return true;
  }

   var objectCompare = function(c,d) { //Object
     //you'll have to consider the number of elements too  
     var lenb = 0, lena = 0;
     for (var label in d){
         if (d.hasOwnProperty(label)) { lenb+=1; } 
     }
     for (var label in c) {
       if (c.hasOwnProperty(label)){
        lena += 1;
         if ( !valueCompare(c[label],d[label]) ) {
            return false;
         }
       }      
     }
     return lena === lenb; 
  }

  var valueCompare = function(c,d) {//String
    return JSON.stringify(c) === JSON.stringify(d);
  }

  return doCompare(a,b);
}

实际上,如果您使用 JSON(在较新的浏览器中是原生的,或者来自库),您只需使用:

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

关于javascript比较对象数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7368666/

相关文章:

javascript - $(document).ready(...) 没有被调用

file - 如何比较二进制文件是否相同?

C# 比较 4 个字符串数组

matlab - 在另一个向量 matlab 中查找向量的一部分

php - 如何使用 jQuery 在表单上以红色字体显示错误消息?

javascript - 在隐藏特定 DIV 和更新 url 之前预加载循环图像

javascript - 使用Jquery读取iFrame内容(iFrame本身加载更多ajax)

javascript - 如何显示和隐藏内部 div onclick 最多 3 个级别?

PHP逐行获取文件并与字符串进行比较

R - 比较 R 中 2 个数据帧之间的数据