【问题标题】:Effective way to add array item to object key将数组项添加到对象键的有效方法
【发布时间】:2019-04-23 12:57:39
【问题描述】:

我有一个来自服务器的值。它包含与我的状态对象具有相同键的对象。该对象的键值是一个包含一项的数组。要在我的 reducer 中处理这个值,我需要将此数组项添加到我状态中的现有对象键中。

简而言之:

我有来自服务器的:{ TEST: ['item1'] }

我的状态是:{ TEST: ['item2'], TEST2: ['item3'] }

预期结果:{ TEST: ['item1', 'item2'], TEST2: ['item3'] }

const handleCreateItemFilter = (state, { payload }) => {
  const { list  } = payload;
  const updatedList = { ...state.regions.list };
  updatedList[Object.keys(list).join()] = [...updatedList[Object.keys(list).join()], Object.values(list).join()];
  return {
    ...state,
    regions: {
      ...state.regions,
      list: updatedList,
    },
    selectedFilter: {
      ...state.selectedFilter, unassignedCountries: [], regions: Object.keys(list).join(),
    },
  };
};

目前,我像上面的示例一样解决了它:创建新的 updatedList,从服务器中为我的对象找到合适的键,并将旧键值和新键值分配给我的新对象数组。但我认为这不是解决这个问题的好方法。

【问题讨论】:

  • 可以添加真实的服务响应吗?你真正期待什么?
  • 我的期望只是使用 reducer 更新我的商店状态
  • 你问题的措辞让我很困惑,因为键是字符串。将项目添加到对象键对我来说没有意义。你正在编写一个reducer,所以你甚至没有向数组中添加一个项目,你正在创建一个新数组。最后——你为什么不认为这是一个好方法?你读过stackoverflow.com/a/40925668/1563833
  • 好吧,这段代码updatedList[Object.keys(list).join()] = [...updatedList[Object.keys(list).join()], Object.values(list).join()];对我来说很迷茫。可能您需要改进此实现。我正在尝试使此代码正常工作,以帮助您。 jsbin.com/bocudojire/edit?js,console,output
  • 同意,这段代码虽然有效,但看起来令人困惑。

标签: javascript reactjs react-redux


【解决方案1】:

所以,我真的不知道你为什么在根状态上使用对象而不是数组,但是,如果我需要使用它,我会这样做:

const response = { TEST: ['item1'] }
const stateInitial = { TEST: ['item2'], TEST2: ['item3']}

const expected = JSON.stringify({ TEST: ['item1', 'item2'], TEST2: ['item3']})

const reducer = (state = stateInitial, { payload }) => {
  return [
    ...Object.entries(payload).map(([k, v]) => (
      typeof stateInitial[k] !== 'undefined' ?
      [ k,[...v, ...stateInitial[k],]] :
      [k, v]
    ))

  ].reduce((obj, [k, v]) => ({ ...obj, [k]: v }), stateInitial)
};


try {
  const output = JSON.stringify(reducer(undefined, { payload: response}))
  if (output != expected) {
    throw `reducer return something different: \n${output} \n\nand expect \n\n${expected}`
  }

  console.log('the test is passed')
} catch (error) {
  console.error(error)
}

【讨论】:

  • 我从服务器(我的初始状态)接收带有区域的对象,每个区域键包含国家/地区数组。我不知道,在我看来也不容易理解这段代码发生了什么:)
猜你喜欢
  • 2016-07-18
  • 2019-07-03
  • 2023-01-19
  • 1970-01-01
  • 2011-09-05
  • 1970-01-01
  • 1970-01-01
  • 2022-06-10
  • 1970-01-01
相关资源
最近更新 更多