我有两个对象。
一个是不会更改的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()
的回调中返回true
或false
。
第二个是使用.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);
}