设置自定义immutablejs键以防止数据重复?

时间:2016-12-07 21:01:15

标签: javascript reactjs redux immutability immutable.js

我的数据格式如下{ 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 ](只有识别某个地方的唯一方式),这样我只需要遍历密钥即可获取我的密钥地方。

2 个答案:

答案 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;
  }
};

你应该没事。

请告诉我这是否适合您。