javascript - 将数组转换为对象以选择对象(重构/优化)

标签 javascript reactjs react-native redux

虽然我在迭代array 来渲染对象时面临加载时间缓慢的问题,但我想更改其数据结构。我显示了季节的目录。当用户单击一个项目时,该项目被标记为已选中。

这是当前的数据结构(数组)

const seasons = [{
  id: 6,
  value: 'All',
}, {
  id: 7,
  value: 'Spring',
}, {
  id: 8,
  value: 'Summer',
}, {
  id: 9,
  value: 'Fall',
}, {
  id: 10,
  value: 'Winter',
}];

我现在将选定的季节 ID 存储为数组

state = {selectedSeasonIds: []}

selectedSeasonIdsid 时,我想从中删除 id。否则,将 id 添加到 selectedSeasonIds。 (这是当前的方法)

if(_.includes(this.state.selectedSeasonIds, id)) {
    let newSelectedSeasonIds = _.filter(this.state.selectedSeasonIds, (curObject) => {
        return curObject !== id;
    });
    this.setState({selectedSeasonIds : newSelectedSeasonIds});
} else {
    let newSelectedSeasonIds = [...this.state.selectedSeasonIds, id];
    this.setState({selectedSeasonIds : newSelectedSeasonIds});
}

这是我的伪代码,用于重构以将我的数组转换为对象结构以提高性能。 (我发现在对象上搜索比在数组上搜索快得多)

将数组更改为对象

const seasons = {
    6 :{
      id: 6,
      value: 'All',
    },
    7: {
      id: 7,
      value: 'Spring',
    }, 
    8: {
      id: 8,
      value: 'Summer',
    },
    9: {
      id: 9,
      value: 'Fall',
    }, 
    10: {
      id: 10,
      value: 'Winter',
    }
};

更改选定的季节 <- 我只想存储对象的键 (id)。但是我想把它当作一个对象来使用

state = {selectedSeasonIds : {}} Can I store object type state? 

这是比数组搜索快 50 倍的预期逻辑。

if(selectedSeasonIds[id]) {
    //remove
    return _.omit(state.selectedSeasonIds, id); < is this right?
} else {
    //add
    return {...state.selectedSeasonIds, [id]:id} <- Does this look ok?
}

好吧,如果你认为这是对的,你可以复制我的代码并将其粘贴到答案中(我也会编辑我的问题)。

否则,您能否提供更好的建议或发现错误?

非常感谢

最佳答案

我想您必须循环遍历 seasons 才能渲染它们。

我的第一个建议是在每个中添加 selected Prop ,这样您就不必在每次渲染时都检查 selectedSeasonsIds

如果这不是一个选项,您仍然可以保留 key value 方法。

onAdd(id) {
  this.setState({
    selectedSeasonsIds: {
      ...this.state.selectedSeasonsIds,
      [id]: this.state.selectedSeasonsIds[id] ? false : true 
    }
  })
}

在检查特定季节是否被选中时,只需:

render() {
  const { seasons, selectedSeasonsIds } = this.state

  return (
    <div>
      ...
      {Object.keys(seasons).map(key =>
        <ItemComponent
          {...propsThatYouMightNeed}
          selected={selectedSeasonsIds[key]}
        />
      )}
    </div>
  )
}

关于javascript - 将数组转换为对象以选择对象(重构/优化),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47140579/

相关文章:

css - 我怎样才能使这个容器作为页脚出现在屏幕上,并使用 React Native 中的 css?

java - 将 Android CameraX 桥接到 React Native

javascript - highcharts donut 饼图中的多行文本

javascript - 使用 Angular Scenario 测试 'any web page'

css - 警告 : a div tag was passed a numeric string value for CSS property fontSize which will be treated as a unitless number in a future version of React

javascript - map 框 gl 与 React js 的错误行为

javascript - react native : synchronously run functions

javascript - 谷歌地图API : Why we need to set title for Marker object?

javascript - 如何在 django 中包含项目根目录外部的静态文件

javascript - 从 react-router-dom 属性 'sumParams' 升级版本 4 useParams () 后 TypeScript 错误在类型 '{}' 上不存在