如何在数组中的对象中向数组中添加新项目?

时间:2019-08-28 13:26:00

标签: javascript reactjs redux react-redux state

这是我的状态

const initState = [
    {
        id: 1,
        criteria: [],
        isInclusion: true,
    },
    {
        id: 2,
        criteria: [],
        isInclusion: true,
    },
];

我正在尝试使用dispatch

将新对象添加到条件数组中
 dispatch(
            addCriteria({
                id: item.id,
                type: item.type,
                groupId: 1, 
            })
        );
reducer中,

我执行以下操作,但是它不会添加到现有组的数组中,而是将其作为新对象添加到其中添加了该条件的数组中。

const addReducer = (state = initState, action) => {
    switch (action.type) {
        case QUERYGROUPS.ADD_CRITERIA: {

            const newCriteria = {
                id: action.payload.id,
                type: action.payload.type,
            }; 
            const newState = [
                ...state,
                state.map(group =>
                    group.id === action.payload.groupId
                        ? {
                              ...group,
                              criteria: newCriteria,
                          }
                        : group
                ),
            ];
            return newState;
        }
    }
};

4 个答案:

答案 0 :(得分:3)

您正在使用... state将所有项目添加到状态对象(也是您要修改的项目),然后再次对其进行映射。这是行不通的。

您应该将状态对象更改为通过引用而不是索引访问项目的对象,并使用id作为访问权限。这也会更快(感谢@Yash Joshi):

navController = findNavController(MainActivity.this, R.id.navHostFragment);
navController.addOnDestinationChangedListener(this);

@Override
public void onDestinationChanged(@NonNull NavController controller, @NonNull NavDestination destination, @Nullable Bundle arguments) {
    int destinationId = destination.getId();
    if (destinationId == R.id.YOUR_DESIRED_FRAGMENT_ID) // your own behavior...
}

这将使您更轻松地访问和更新状态,更容易保持不变。 这样您可以像这样更新它:

const initState = {
    1: {
        criteria: [],
        isInclusion: true,
    },
    2: {
        criteria: [],
        isInclusion: true,
    },
};

要向其中添加新项目:

case QUERYGROUPS.ADD_CRITERIA: {
        const newCriteria = {
            id: action.payload.id,
            type: action.payload.type,
        }; 
        const newState = {
            ...state,
            [action.payload.groupId]: {
                ...state[action.payload.groupId],
                criteria: [
                    ...state[action.payload.groupId].criteria,
                    newCriteria
                ],
            }                
        };
        return newState;

希望这会有所帮助。编码愉快。

答案 1 :(得分:0)

尝试点差运算符(es6):

return [
   ...state,
   newCriteria,
]

这将返回一个带有newCriteria对象的新数组。

答案 2 :(得分:0)

这是我要怎么做:

WITH cte AS ( 
--your code and add rownumber column
  seq = ROW_NUMBER() OVER(PARTITION BY PRESCRIPTIONID, Antibiotic_Prescribed ORDER BY PRESCRIPTIONID)
 )
SELECT * from cte where seq = 1

答案 3 :(得分:0)

我认为您应该遵循Domino987的方法,这样会更快。但是,如果您仍然希望继续使用您的方法。您可以尝试以下方法:

const newState = state.map(item => item.id === newItem.id ? ({ ...item, ...newItem }) : item );

return newState;

希望这会有所帮助!

相关问题