不可变JS比较嵌套结构

时间:2015-10-02 18:22:56

标签: javascript compare immutable.js

我有2个嵌套结构 newState newState1

但是当我比较他们的时候,equals()或者Immutable.is()返回 false 。这些结构中的值相同。

如何正确比较 newState newState1

Array
(
    [7] => Array
        (
            [49] => 49
            [41] => 41
        )

    [8] => Array
        (
            [70] => 70
            [69] => 69
        )

    [105] => 105
    [9] => 9
    [10] => 10
)

JSFiddle中的代码: https://jsfiddle.net/z3xuagwm/

3 个答案:

答案 0 :(得分:19)

似乎immutablejs不进行深度转换,所以如果你的值是对象,那么它仍然是对象。

当您在每个更新步骤中创建不同的对象时,当您相互比较时,这些对象将被视为不同,因此您还应将其转换为Immutable.Map对象,以使比较成立。



// Primitives.
var test1 = Immutable.Map({
    a: 'a', 
    b: 'b', 
    c: 'c'
});
var test2 = Immutable.Map({
    a: 'a',
    b: 'b',
    c: 'c'
});
console.log('Test primitive', test1.equals(test2)); // true

// Object
test1 = Immutable.Map({
    a: 'a',
    b: 'b',
    c: {}
});
test2 = Immutable.Map({
    a: 'a',
    b: 'b',
    c: {}
});
console.log('Test object', test1.equals(test2));  // false
// Its because
var a = {};
var b = {};
console.log('a === b?', a === b); // false

// Convert
test1 = Immutable.Map({
    a: 'a',
    b: 'b',
    c: Immutable.Map({})
});
test2 = Immutable.Map({
    a: 'a',
    b: 'b',
    c: Immutable.Map({})
});
console.log('Test converted', test1.equals(test2)); // true

<script src="https://cdnjs.cloudflare.com/ajax/libs/immutable/3.7.5/immutable.min.js"></script>
&#13;
&#13;
&#13;

答案 1 :(得分:9)

在推送函数中将Immutable.Map更改为Immutable.fromJS(如前所述 - 只有fromJS会进行深度转换,Map,List等不会):

askAndReadResponse

答案 2 :(得分:0)

如何使用JSON.stringify

JSON.stringify(values) !== JSON.stringify(anothervalue);

如果您知道它们不是圆形对象,并且不包含函数,我认为这是比较它们的最快方法。