过滤后将对象保留为对象

时间:2018-11-16 13:34:23

标签: javascript immutable.js

那是我的数据结构

const data = Immutable.fromJS({
        1: {
            foo: 'bar'
            ...
        },
        2: {
            foo: 'foo'
            ...
        },
        3: {
            foo: 'foobar'
            ...
        },
    },
});

我想过滤数据,我需要我的filteredData是完全相同的类型-Immutable Object。当我跑步时

const filtered = data.get('data').valueSeq().filter(obj => {
    ...
    return obj;
});

我得到这个[{}, {}, {}, ...]

我需要像这样(作为输入数据){1: {...}, 2: {...}, 3: {...}}。正确的filter函数是什么,以便返回类型已经是Map而不是Array。还是没有这样的东西。

3 个答案:

答案 0 :(得分:1)

过滤后,您的对象仍然是ImmutableObject(请参见示例)

const data = Immutable.fromJS({
    data: {
        1: {
            foo: 'bar'
        },
        2: {
            foo: 'foo'
        },
        3: {
            foo: 'foobar'
        },
    },
    kittens: {}
});

const res = data.get('data').filter(obj=>obj.get('foo') === 'bar');
console.log(res);

//still immutable object
console.log(res.get('1'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/immutable/3.8.2/immutable.min.js"></script>

答案 1 :(得分:1)

我的主张保留了原始数据结构:

const data = Immutable.fromJS({
    data: {
        1: {
            foo: 'bar'
        },
        2: {
            foo: 'foo'
        },
        3: {
            foo: 'foobar'
        },
    },
});

const filtered = data.updateIn(
  ['data'],
  v => v.filter(obj=>obj.get('foo') === 'bar'));
  
console.log(filtered);
<script src="https://cdnjs.cloudflare.com/ajax/libs/immutable/3.8.2/immutable.min.js"></script>

答案 2 :(得分:0)

您需要删除.valueSeq()。那就是将对象转换为数组的原因