比较两个对象不会得到正确的结果
comparing two objects does not give correct results
我正在尝试比较两个对象。年龄不同,但仍然说他们是一样的。。这是我的代码
var personA =
{
name: "Josh Kloss",
age: 33
}
var personmB =
{
name: 'Josh Kloss',
age: 43
}
function compareTwoPeople(a, b) {
var person1 = Object.keys(a);
var person2 = Object.keys(b);
if (person1.length !== person2.length) {
console.log("They are not same");
}
else {
for (var i = 0; i < person1.length; i++) {
if (person1[i] === person2[i]) {
console.log("They are same");
}
}
}
}
compareTwoPeople(personA, personmB);
我怎样才能比较这两个物体。。。谢谢
Close,只需要稍微整理一下比较,就可以使用键和迭代器获得对象值。
var personA =
{
name: "Josh Kloss",
age: 33
};
var personB =
{
name: 'Josh Kloss',
age: 43
};
function compare(a, b) {
var aKeys = Object.keys(a),
bKeys = Object.keys(b);
if(aKeys.length != bKeys.length) return false;
for(var i = 0; i < aKeys.length; i++) {
if(a[aKeys[i]] != b[bKeys[i]]) return false;
}
return true;
}
compare(personA, personB);
您正在查找person1[i]
,它将是[ 'name', 'age' ][0]
,它是'name'
,密钥名称。这两个对象都是一样的。你的问题的快速解决方案是:
if (a[person1[i]] !== b[person2[i]]) {
console.log("They are not the same");
return;
}
然而,这不是一个很好的相等性测试,因为对象可能都有两个键,但键不同。
您可以考虑使用Array.prototype.every作为属性值比较部分。它是有效的,因为它在第一次不匹配时返回false,而不是在不需要的时候遍历所有属性:
var personA = {name: "Josh Kloss", age: 33};
var personB = {name: 'Josh Kloss', age: 43};
// Return true if objects a and b have the same properties
// with the same values. Otherwise, false.
function compareTwoPeople(a, b) {
var person1 = Object.keys(a);
var person2 = Object.keys(b);
// Use first test to initialise result
var result = person1.length === person2.length;
// If passed the first test, do the second
if (result) {
// Use every to test each value, returns false at first mismatch
result = person1.every(function(prop){
return a[prop] === b[prop];
});
}
return result;
}
document.write('Are they the same? ' + compareTwoPeople(personA, personB));
您可以通过浏览每个属性进行比较,
var personA =
{
name: "Josh Kloss",
age: 33
};
var personB =
{
name: 'Josh Kloss',
age: 43
};
function getObjectSize(obj){
var size = 0, key;
for (key in obj) {
if (obj.hasOwnProperty(key)) size++;
}
return size;
}
function isObjectsEqual(a, b){
//check objects has equal length
if(getObjectSize(a) !== getObjectSize(b)){
return false;
}
//check properties are equal
for (var key in a) {
if (b.hasOwnProperty(key)){
if(a[key] != b[key]){
return false;
}
}
else{
return false;
}
}
return true;
}
isObjectsEqual(personA, personB); //test function
相关文章:
- 对象拟合:获取结果尺寸
- JSON.stringify和Object.keys在同一个对象上产生不同的结果
- JQuery Deferred Ajax,将结果保存在调用对象中
- 在页面对象文件中验证sendKeys结果会导致未定义的错误(Protractor)
- 返回带有筛选结果的新JSON对象
- 为什么纬度结果对象从谷歌地图 API 更改
- 当我运行代码时,我得到以下结果 []对象对象] [对象对象],但应该给我一个有序数组
- 为什么脚本 Db 查询结果对象不同
- 获取 FileReader() 的结果对象
- 从 Webix 中结果对象的属性加载数据
- 如何在函数中返回结果对象
- 如何在对象数组中循环Json结果对象
- 将FileReader内部的结果对象分配给变量
- JS不给出任何结果(对象)
- 在带有填充嵌套数组的mongoDB文档中查找并构建新的结果对象
- 敲出$parent点击click事件很好,但是结果对象的属性没有定义
- 更正JSON结果对象
- 将查询结果对象传递给单独的函数
- 从结果对象数组中获取一个值
- JSON响应的问题,结果对象的属性被读取为未定义,但我可以看到它存在