【问题标题】:How to push an objects into an array inside another root array如何将对象推送到另一个根数组中的数组中
【发布时间】:2017-07-22 16:38:32
【问题描述】:

我正在使用 GPS 相关程序,因此我正在积极接收许多位置对象。这是我想要实现的数组形式。最初它应该是一个空数组,然后只从一个孩子开始,所有传入的位置对象都将存储在那个孩子中,直到发出其他命令。当下一个事件开始时,所有传入的对象都将存储在第二个子数组中,希望你能得到要点。

rootArray = [
  [
    {lat: '', long: ''},
    {lat: '', long: ''},
    {lat: '', long: ''},
  ],
  [
    {lat: '', long: ''},
    {lat: '', long: ''},
    {lat: '', long: ''},
  ]
]

这是我尝试过但没有成功的方法。

// I am working with redux here actually
// rootArray: []

case NEW_LOCATION_OBJECT_COMING:
  return {
    ...state,
    rootArray: state.rootArray[state.rootArray.length].concat(action.payload.locationObject),
  }

【问题讨论】:

  • 你不能把concat改成push吗? state.rootArray[state.rootArray.length].push(action.payload.locationObject)
  • 不要使用push会改变数组,另一方面concat是返回新数组的好方法。

标签: javascript arrays reactjs redux lodash


【解决方案1】:

数组中的项目索引从0length - 1,所以如果你尝试访问索引length 处的元素,你会得到undefined。我们应该这样做:

...
rootArray: [
  ...state.rootArray.slice(0, state.rootArray.length - 1),
  state.rootArray[state.rootArray.length - 1].concat(action.payload.locationObject)
],
...

原因是,在之前的方法中,我们将其最后一个元素与有效负载连接的结果分配给rootArray,因此其他所有内容都会丢失,我们的rootArray 将成为一个简单的对象数组。

我们需要通过扩展现有数组来保留我们所拥有的,为了实现这一点,我创建了一个新数组,看起来像旧的 rootArray 没有最后一个元素,新的最后一个元素是旧最后一个元素的连接和有效载荷。我希望这是有道理的。

编辑 鉴于您的评论,这取决于您如何启动 rootArray 如果它只是一个空数组,那么这种方法会失败,您应该这样做:

...
rootArray: [
  ...state.rootArray.slice(0, state.rootArray.length - 1),
  state.rootArray.length > 0
    ? state.rootArray[state.rootArray.length - 1].concat(action.payload.locationObject)
    : [...action.payload.locationObject]
],
...

否则您可以只启动rootArray[[]] 并使用第一个版本。

【讨论】:

  • 我还是遇到了这个错误,好像它无法识别 rootArray
  • 你应该使用 redux 开发工具来调试这个,你更新状态的方式一开始是错误的,但是如果 state.rootArrayundefined 那么还有其他错误。在调度操作之前尝试调试它或记录 state.rootArray 是什么。
  • 我试过了,它只是一个空数组,应该不会失败
  • 我编辑了,我忘记了第二部分的length - 1,如果它是一个空数组那么它是正常的它失败,rootArray[rootArray.length - 1]没有任何东西,我想你的initialState是@987654339 @,改成rootArray:[[]]
  • 我对 slice 方法做了一些研究,但我不明白在这里使用它的原因。我已经改编了您的代码的第一个版本,它按预期工作,但是当下一个事件开始时,它只会将 concats 保留到 rootArray 的第一个孩子,而不是启动第二个 childArray 并从那里继续。我怀疑该切片方法有些问题......嗯
猜你喜欢
  • 1970-01-01
  • 2017-03-02
  • 1970-01-01
  • 1970-01-01
  • 2020-08-23
  • 2019-12-22
  • 2020-02-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多