初学者Redux / React - 如果不处于状态,则添加单个项目

时间:2018-06-02 13:42:00

标签: javascript reactjs redux react-redux

我尝试将单个项目添加到嵌套的Redux状态,如果该项目已经不在列表中。

我不在乎用简单的JS做这件事,我想要Redux酱汁。

我的州看起来像这样:

Function FindColumn(strTableName As String, strColumnName As String) As Boolean
    Dim db As Database
    Set db = DBEngine.OpenDatabase("unc path to your database")
    On Error Resume Next
    Set fld = db.TableDefs(strTableName).Fields(strColumnName)
    If Err = 0 Then FindColumn = True
    Set fld = Nothing       
    db.Close
    Set db = Nothing
End Function

这是我在减速机中尝试过的:

  state: {
    data: {
      list: []
    },
  },

问题是,有时我要添加的项目在数组中已经,因此我的列表中有一个副本(我不想要)。

  

如果首先检查此项目是否,我如何将项目添加到我的列表中   已经在那里?

2 个答案:

答案 0 :(得分:3)

您可以使用some方法。它将返回truefalse并在匹配时停止迭代数组。例如:

case SOME_ACTION: {
  // iterate over the list and compare given item to item from action
  const existsInArray = state.data.list.some(l => l.id === action.payload.list.id)
  if(existsInArray) {
    return state;
  }

  return {
    ...state,
    data: {
      ...state.data,
      list: [action.payload.list, ...state.data.list]
    }
  }
}

编辑:

您在评论中写道,如果元素存在于数组中,您希望它将成为列表中的第一个项目。我要做的是过滤掉这个元素(如果存在),然后将该项作为第一个元素从动作中返回:

case SOME_ACTION: {
  // filter out the element
  const copyOfArray = state.data.list.filter(l => l.id !== action.payload.list.id)
  // put to the beginning of the array
  copyOfArray.unshift(action.payload.list);

  return {
    ...state,
    data: {
      ...state.data,
      list: copyOfArray
    }
  }
}

答案 1 :(得分:1)

元素不会重复,始终为0索引,

return {
    ...state,
    data: {
      ...state.data,
      list: [].concat(action.payload.list, state.data.list.filter(val=>val.id==action.payload.list.id))
    }
  }