【发布时间】:2015-09-15 02:27:47
【问题描述】:
我正在尝试编写一个函数来检查两个对象是否具有相同的值。此功能要求我检查存储为原始对象内的值的任何对象的相等性。我开发的方法(见下面的代码)是首先检查非对象值的相等性。然后,如果这些都匹配,我再次遍历对象并对原始函数进行递归调用,这允许我比较两个对象的每个嵌套级别。
但是,这种方法仅部分有效。递归调用的性质意味着我只能在对象中的第一个键值对处检查嵌套对象的相等性。一旦比较了第一组嵌套对象并且递归调用返回,我无法弄清楚如何检查包含嵌套对象的任何其他键值对。这是函数:
var deepEqual = function(val1, val2) {
if (typeof val1 === 'object' && typeof val2 === 'object') {
for (i in val1) {
for (i in val2){
if (typeof val1[i] !== 'object' && typeof val2[i] !== 'object') {
if (val1[i] !== val2[i]) {
return false
}
}
}
}
for (i in val1) {
for (i in val2){
if (typeof val1[i] === 'object' && typeof val2[i] === 'object') {
return deepEqual(val1[i], val2[i])
}
}
}
return true
}
else if (val1 === val2) {
return true
}
else return false
}
我的基本问题是,我认为我需要一个递归调用来检查嵌套对象的深度相等性,但我只能成功执行一次此检查。有没有人试图解决这样的问题?如果您需要更具体的内容,我将提供特定对象的结果示例。谢谢!
【问题讨论】:
-
您是说您不在乎属性名称吗?顺便说一句,
for (i in val1) for (i in val2)是灾难性的。 -
我正在检查值。同意 for 循环不是最优的 - 请耐心等待,我是一个没有经验的程序员,这是我第一次解决这个问题
-
所以您会期望
{a:1, b:2}和{a:2, b:1}相等(因为它们包含相同的值)? -
您是否考虑过仅在两个对象上使用 JSON.stringify 并比较它们的字符串是否相等?不确切知道什么构成相等或对象的结构,我仅将其发布为评论。如果这种方法有任何价值,我将升级为答案。
-
对不起,没有。我关心财产名称。我误解了你的第一个问题。例如,
var val1 = {"city": "Seattle", "name": {"first": {"Ben": "Benny"}}, "country": "USA", "firstname": {"first": {"Ben": "Bedanny"}}} var val2 = {"city": "Seattle", "name": {"first": {"Ben": "Benny"}}, "country": "USA", "firstname": {"first": {"Ben": "Benny"}}}应该返回 false,但它返回 true(因为永远不会检查第二组嵌套对象,因为如果第一组嵌套对象相同,则函数返回 true。
标签: javascript recursion javascript-objects deepequals