2016-11-25 63 views
1

内我有一个不变的地图这样不可变JS复制/复制列表地图

Immutable.fromJS({ 
    sortingOnFields: false, 
    items: [], 
    selectedItems: [], 
    columnsConfigs: { 
     meta: {}, 
     columns: {} 
    }, 
}); 

我怎么复制的项目清单selectedItems列表。

return state.set('selectedItems', state.get('items'));

不正确地做这项工作作为以后如果我做

props.listing.get('selectedItems').includes(Immutable.fromJS(item)); 

其中Immutable.fromJS(item)是从“项目”列表中,则返回false。

我想这里面工作,但看起来有点过分

return state.set('selectedItems', Immutable.fromJS(state.get('items').toJS())); 

一个更好的解决方案的任何想法?

+0

你为什么要以这种方式复制项目?当然,最好将你的物品作为一个清单,然后存储所选物品的索引或ID。 – VanDanic

回答

0

问题在于你的测试。你成功设置在两个键相同的列表。您正在检索items这是一个列表的值,并且您将该列表设置为与selectedItems上的值完全相同的列表。

即使那工作,你的测试没有完成它的工作。您写道:

props.listing.get('selectedItems').includes(Immutable.fromJS(item)); 

这条线说:在selectedItems获取列表。现在使用fromJS方法创建一个全新的不可变对象。 selectedItems中的列表是否包含新的不可变对象?答案是否定的,因为你只是从头开始创建该项目,所以它绝对不包含在列表中selectedItems

如果每个项目是一个原始值,你可以检查这样的:

props.listing.get('selectedItems').includes(item); 

如果每个项目是一个对象,那么你将它转换为不可变对象?如果没有,那么你可以传入一个对该项目的引用,如上所述。如果您确实将其转换为Immutable对象,请确保将引用传递给与includes方法相同的正确的不可变等效项。