我尝试将单个项目添加到嵌套的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: []
},
},
问题是,有时我要添加的项目在数组中已经,因此我的列表中有一个副本(我不想要)。
如果首先检查此项目是否,我如何将项目添加到我的列表中 已经在那里?
答案 0 :(得分:3)
您可以使用some
方法。它将返回true
或false
并在匹配时停止迭代数组。例如:
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))
}
}