此函数检查两个对象是否具有相同的值:
_.isEqual = (a, b) => {
const aKeys = Object.getOwnPropertyNames(a)
const bKeys = Object.getOwnPropertyNames(b)
if (aKeys.length !== bKeys.length) {
return false
}
for (var i = 0; i < aKeys.length; i++) {
var propName = aKeys[i]
if (a[propName] !== b[propName]) {
return false
}
}
return true
}
我用every
替换了for循环:
_.isEqual = (a, b) => {
const aKeys = Object.getOwnPropertyNames(a)
const bKeys = Object.getOwnPropertyNames(b)
if (aKeys.length !== bKeys.length) return
return aKeys.every((key, index) => {
return key === bKeys[index]
})
}
但是,即使a和b不相等,函数也会返回true
。
我做错了什么?
输入:
const obj1 = {
x: 0,
y: 0,
z: 0
}
const obj2 = {
x: 0,
y: 0,
z: 0
}
答案 0 :(得分:1)
Join<Entity1,Entity2> join = root.join("relationshipA", JoinType.LEFT);
如果我将var first = "hello"
var second = "meow"
console.log("recognized")
isEqual(first,second);
function isEqual(a, b) {
console.log("running")
const aKeys = Object.getOwnPropertyNames(a)
const bKeys = Object.getOwnPropertyNames(b)
if (aKeys.length !== bKeys.length) {
console.log("false")
return false
}
for (var i = 0; i < aKeys.length; i++) {
var propName = aKeys[i]
if (a[propName] !== b[propName]) {
console.log("false")
return false
}
}
console.log("return true")
return true
}
更改为second
,则打印出false,它将打印出true。我会说它与您的输入数据有关。您是否尝试使用较小的输入数据集以确保其良好状态?
更新:或者仅在第二次交互时才出现问题?如果是这种情况,你有两个hello
陈述
return
这可能就是你要找的东西。如果var first = ["shoop", "doop", "woop", "loop", "koop"]
var second = ["hamp","damp", "samp", "wamp"]
console.log("recognized")
var returned = isEqual(first,second);
console.log(returned)
function isEqual(a, b) {
const aKeys = Object.getOwnPropertyNames(a)
const bKeys = Object.getOwnPropertyNames(b)
if (aKeys.length !== bKeys.length) {
return aKeys.every((key, index) => {
key === bKeys[index]
})
}
}
和akey
长度不相等,则bkey
方法会执行此操作,并在此情况下返回every
false
和key
不相等,返回bkey
。 false
不成立,if (aKeys.length !== bKeys.length)
将作为js
在回复“如何返回true或false”时,如果if语句从未运行,则undefined
等于{{1} }}
true
答案 1 :(得分:1)
有几件事要讨论:
(x) => x
返回x。(x) => { ... }
像普通函数一样执行{}
内的语句。在return
中添加{}
或将其修改为第一个表单。
return aKeys.every((key, index) => {
return key === bKeys[index]
})
或
return aKeys.every((key, index) => key === bKeys[index])
Object.getOwnPropertyNames({a:1, b:2, c:3})
无法保证按['a', 'b', 'c']
的顺序返回。取决于JS实现。 V8努力保持秩序,但不是所有的JS实现都会。它可以返回['c', 'a', 'b']
。
要解决此问题,您可以对列表进行排序。
const aKeys = Object.getOwnPropertyNames(a).sort()
const bKeys = Object.getOwnPropertyNames(b).sort()
如上所述,您的循环仅比较键。 {a:1, b:2}
和{a:5, b:5}
将返回true
,因为您只检查a
和b
是否存在,但不会比较它们的值。
你可以这样做:
return aKeys.every((key, index) => {
if (key !== bKeys[index]) return false
if (a[key] !== b[key]) return false
})
但它只测试浅层物体。如果一个对象包含另一个对象,它将始终从{} !== {}
返回false。你需要添加一个检查“如果它是一个对象,然后递归调用_isEqual”。
您可以这样做,而不是订购密钥:
return aKeys.every((key, index) => {
return b.hasOwnProperty(key)
})
但可能性能较差。尝试基准来看看。
答案 2 :(得分:0)
我找到了解决方案:
_.isEqual = (a, b) => {
const aKeys = Object.getOwnPropertyNames(a)
const bKeys = Object.getOwnPropertyNames(b)
if (aKeys.length !== bKeys.length) return
return aKeys.every((key, index) => a[key] === b[bKeys[index]])
}
我正在评估keys
而不是values
!这就是函数始终返回true
的原因。
答案 3 :(得分:-1)
在修改后的代码中,您需要返回false
或结果。你应该添加一个else语句:
_.isEqual = (a, b) => {
const aKeys = Object.getOwnPropertyNames(a)
const bKeys = Object.getOwnPropertyNames(b)
if (aKeys.length !== bKeys.length){
return false;
} else { // <-- this is new here //
return aKeys.every((key, index) => {
key === bKeys[index]
})
}