比较javascript中具有布尔值、字符串和对象值的两个对象



我有两个对象。

一个是不会更改的defaultValue对象,另一个是可以更改的comparedValue。

const defaultValues = {
adminProfile: "Option 1",
channel: {id: 0, name: ''},
datetime: moment().format("yyyy-MM-DDTHH:mm:ssz"),
memo: '',
phoneNumber: 'none',
register: 'yes',
source: {id: 0, name: ''},
starred: false,
studio: 'common',
subject: {id: 0, name: ''},
}
const comparedValues = {
adminProfile: "Option 1",
channel: {id: 0, name: ''},
datetime: moment().format("yyyy-MM-DDTHH:mm:ssz"),
memo: '',
phoneNumber: 'none',
register: 'yes',
source: {id: 0, name: ''},
starred: false,
studio: 'common',
subject: {id: 0, name: ''},
}

若属性的一个值和另一个值不同,函数将返回false。

这是我写的代码

const validation = (comparedValues) => {
return  Object.keys(defaultValues).some(value => {
if (comparedValues.hasOwnProperty(value)) {
if (typeof comparedValues[value] === 'object') {
comparedValues[value].id === defaultValues[value].id
}
comparedValues[value] === defaultValues[value]
}
})
};

然而,这个函数总是返回true,如何使函数逐一比较两个对象和其他值,并在捕捉到差异时返回false?

这里有两个问题:

第一个是,您不会从传递给.some()的回调中返回truefalse

第二个是使用.some(),如果数组中至少有一个项符合条件,则返回true。但是,您需要检查所有是否相等。这意味着您需要使用.every()而不是some()

要修复所有问题,请将return语句添加到回调中并使用every():

const validation = (comparedValues) => {
return  Object.keys(defaultValues).every(value => {
if (comparedValues.hasOwnProperty(value)) {
if (typeof comparedValues[value] === 'object') {
return comparedValues[value].id === defaultValues[value].id
}
return comparedValues[value] === defaultValues[value]
}
})
};

现在,如果所有默认值都等于比较值,validation函数将返回true

比较两个对象的简单方法:D

const compare = (objectA, objectB) => {
return JSON.stringify(objectA) === JSON.stringify(objectB);
}

最新更新