2016-11-16 54 views
0

我一直在寻找我的一些reducer的表现,并注意到一些奇怪的行为,这与我如何合并mergeDeep工作是相反的。我认为merge和mergeDeep的工作原理是一样的,除了比较最高级别的键/值之后,合并停止但mergeDeep继续挖掘。合并vs MergeDeep

例如:

let obj1 = Map({ 
    a: Map({ 
     b: Map({ 
      c: 10 
     }) 
    }) 
}); 

let obj2 = obj1; 

obj1 = obj1.mergeIn(['a'], Map({ 
    b: Map({ 
     c: 10 
    }) 
})); 

console.log(obj1.toJS()) // { a: { b: { c : 10 } } } 
console.log(obj1 === obj2) // false 

VS

let obj1 = Map({ 
    a: Map({ 
     b: Map({ 
      c: 10 
     }) 
    }) 
}); 

let obj2 = obj1; 

obj1 = obj1.mergeDeepIn(['a'], Map({ 
    b: Map({ 
     c: 10 
    }) 
})); 

console.log(obj1.toJS()) // { a: { b: { c: 10 } } } 
console.log(obj1 === obj2) // true 

任何人都可以解释为什么他们不都返回true?如果我必须使用mergeDeep,这不会是一个巨大的性能损失吗?或者我不会重新渲染的事实常常超过它?

+0

我其实并不是现在的原因,但是如果你想在不可变的数据结构上使用等式检查(例如应该更新对反应组件的检查),你需要使用Immutable.is(obj1,obj2)。 – erdysson

回答

0

这与JS比较对象的方式有关。以下是这种特殊行为的示例:

const a = { 
    dog: 'fido' 
} 

const b = { 
    dog: 'fido' 
} 

const c = a; 

console.log(a === b); // false 
console.log(a === c); // true 

这说明了常规合并和深度合并之间的区别。建议比较您正在观看的特性的特定关键/值,而不是比较整个对象的等同性以优化性能。