我的数据格式如下{
places: [
{
place: {
lat: 123,
lon: 321,
}
},
{
place: {
lat: 432,
lon: 234,
}
},
]
}
。
我想将此项仅与新数据合并,并返回更新地点的新地图。如果我得到一个地方的对象,其中一个地方与之前的地方有相同的纬度/经度,我不想追加那些数据。
case RECEIVE_PLACES:
return state
.set('places', state.get('places').update(fromJS(action.places)))
我如何使用地图执行此操作?目前我以这种方式附加但是一切都是重复的,我无法找到一个非混乱的解决方案:
${lat},${lon}
理想情况下,我会将每个对象的密钥设置为[lists = ([], [], [])
for element in [1, 4, 7, 9, 2, 10, 5, 8]:
if element in range(0, 3):
lists[0].append(element)
elif element in range(3, 6):
lists[1].append(element)
elif element in range(6, 25):
lists[2].append(element)
array1, array2, array3 = lists
](只有识别某个地方的唯一方式),这样我只需要遍历密钥即可获取我的密钥地方。
答案 0 :(得分:1)
您可以过滤掉重复的地方物品
case RECEIVE_PLACES: {
const newPlaces = fromJS(action.places).filter((newItem) => (
!state.get('stores').find((oldItem) => (
oldItem.place.lat === newItem.place.lat &&
oldItem.place.lon === newItem.place.lon
)
);
return state.set('stores', state.get('stores').update(newPlaces));
}
答案 1 :(得分:0)
如果您使用Immutable.Set而不是Immutable.List来持久化这些地方,那么一切都会变得更容易,事情会更好。
所以,如果在你的reducer中你做了类似的事情:
import { Map, Set, fromJS } from 'immutable';
const initialState = new Map([
['places', new Set()],
// Whatever other props that Map has
]);
const yourReducer = (state = initialState, { type, places }) => {
switch (type) {
RECEIVE_PLACES:
return state.update('places', places => places.merge(
new Set(fromJS(places))
);
default:
return state;
}
};
你应该没事。
请告诉我这是否适合您。