everycode icon indicating copy to clipboard operation
everycode copied to clipboard

对比两个对象是否相等

Open nunnly opened this issue 8 years ago • 6 comments
trafficstars

深入对比两个对象(key相同)value是否相等,如果相等返回true,如果不等,返回不相等的字段的key用.分隔,

function compareObject(obj1, obj2) {

}
const a = {a:1, b: 2, c:{d:1}}
const b = {a: 1, b: 2, c:{d:2}}
compareObject(a, b);
// => ['c.d']

const c = {a:1, b: 2, c:{d:1, f: 2}};
const d = {a:1, b: 3, c:{d:5, f: 1}};
compareObject(c, d);
// => ['b', 'c.d', 'c.f']

nunnly avatar Oct 12 '17 08:10 nunnly

function compareObject(obj1,obj2) {
    var list = [];
    for(var key in obj1){
      if(typeof obj1[key] === "object"){
         var newlist = compareObject(obj1[key],obj2[key])
          
            newlist = newlist.map(function (value) {
                return key + "." +value
            })
            list = list.concat(newlist)
          
      }else if(obj1[key] !== obj2[key]){
          list.push(key)
      }
    }
    if(list.length===0){
    	return true
    }return list
}

zane277 avatar Oct 13 '17 01:10 zane277

function compareObject(obj1,obj2) {
  var list = [];
  for(var key in obj1){
    if(typeof obj1[key] === "object"){
      var newlist = compareObject(obj1[key],obj2[key])
      if( Object.prototype.toString.call(newlist) === "[object Array]"){
        newlist = newlist.map(function (value) {
          return key + "." +value
        })
        list = list.concat(newlist)
      }
    }else if(obj1[key] !== obj2[key]){
      list.push(key)
    }
  }
  return list.length == 0? true:list
}

weichenguang avatar Oct 13 '17 01:10 weichenguang

function compareObject(obj1, obj2) {
  if(JSON.stringify(obj1) === JSON.stringify(obj2)){
    return true;
  }else {
    var result = [];
    for(var key in obj1){
      if(typeof obj1[key] === "object"){
        var array = compareObject(obj1[key],obj2[key])
        array = array.map(function (value) {
          return key + "." +value
        })
        result = result.concat(array)
      }else if(obj1[key] !== obj2[key]){
        result.push(key)
      }
    }
    return result;
  }
}

Gxiangyu avatar Oct 13 '17 01:10 Gxiangyu

function compareObject(object1,object2){
   var arr = [];
   for(var i in object1){
	for(var j in object2){
		if(i == j && object1[i] != object2[j]){
			if(object1[i] instanceof Object){
				if(object2[j] instanceof Object){
					for(var x in object1[i]){
					for(var y in object2[j]){
						if(x == y && object1[i][x] != object2[j][y]){
							arr.push(i +"."+ x);
									}
								}
							}
						}else{
							arr.push(i);
							}
								
						}else{
							arr.push(i);
							}
						}
					}
				}
				document.write(arr);
			}
			compareObject(object1,object2);

Caocp avatar Oct 13 '17 01:10 Caocp

不知道是以 obj1 的 key 为基准还是所有 key

function merge(keys1, keys2){
  var keys = [].concat(keys1);
  keys2.forEach(function (i){
    if (keys.indexOf(i) === -1){
      keys.push(i);
    }
  });
  return keys;
}

function compareObject(obj1, obj2){
  var keys1 = Object.keys(obj1);
  var keys2 = Object.keys(obj2);
  var keys = merge(keys1, keys2);
  var result = [];
  keys.forEach(function (key){
    if (typeof obj1[key] === 'object' && typeof obj2[key] === 'object'){
      var children = compareObject(obj1[key], obj2[key]);
      if (children !== true) {
        children = children.map(function (i){
          return key + '.' + i;
        });
        result = result.concat(children);
      }
    }else if (obj1[key] !== obj2[key]) {
      result.push(key);
    }
  });
  return !result.length ? true : result;
}

JSON.stringify 有键值顺序风险并忽略一些值。

Robin-front avatar Oct 13 '17 03:10 Robin-front

这个代码放在浏览器里面运行报错,代码如下: `var bbbb = {a:1, b: 2, c:{d:1}} var cccc = {a: 1, b: 2, c:{d:2}} compareObject(bbbb,cccc); function compareObject(obj1, obj2) { var list = [] for(var key in obj1) { if(typeof obj1[key] === 'object') { var newlist = compareObject(obj1[key], obj2[key]) if(Object.prototype.toString.call(newlist) === "[object Array]") { //把遍历对象里得到的不同的值放到数组里面去. newlist = newlist.map(function (value) { return key + '.' +value }) list = list.concat(newlist) }

   } else if(obj1[key] != obj2[key]) {
       list.push(key)
   }
   return list.length == 0? true: list

} }` 报错信息: VM74:1 Uncaught SyntaxError: Identifier 'bbbb' has already been declared at :1:1 找不到什么原因,求指导.

muzishuiji avatar Nov 04 '17 03:11 muzishuiji