Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

对比两个对象是否相等 #48

Open
nunnly opened this issue Oct 12, 2017 · 6 comments
Open

对比两个对象是否相等 #48

nunnly opened this issue Oct 12, 2017 · 6 comments
Labels

Comments

@nunnly
Copy link
Owner

nunnly commented Oct 12, 2017

深入对比两个对象(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 nunnly added the 难度5 label Oct 12, 2017
@zane277
Copy link

zane277 commented Oct 13, 2017

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
}

@weichenguang
Copy link

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
}

@Gxiangyu
Copy link

Gxiangyu commented Oct 13, 2017

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;
  }
}

@Caocp
Copy link

Caocp commented Oct 13, 2017

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);

@Robin-front
Copy link

不知道是以 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 有键值顺序风险并忽略一些值。

@muzishuiji
Copy link

这个代码放在浏览器里面运行报错,代码如下:
`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
找不到什么原因,求指导.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

7 participants