递归嵌套用户组查询异常:targetGroup赋值后仍为空对象
Hey there! Let's break down why your targetGroup is staying an empty object even after running your recursive search function. Based on what you've shared, here are the most likely culprits and fixes:
1. Recursive Function Return Logic Is Broken
The most common issue with recursive search functions is failing to properly pass the found result up the call stack. If your search function finds the target group but doesn't return it explicitly (or doesn't propagate the result from child recursive calls), the parent call will never get the value—leaving your targetGroup stuck as the initial empty object.
Fix Example:
Make sure your recursion returns the found group immediately, and propagates results from child searches:
function search(groups, targetUserId) { for (const group of groups) { // Check if current group contains the target user if (group.users?.includes(targetUserId)) { return group; // Return the match immediately } // Recurse into subgroups and check for a result const foundSubgroup = search(group.subGroups || [], targetUserId); if (foundSubgroup) { return foundSubgroup; // Pass the child result up } } return null; // Return null if no match in this branch }
Then, in your searchGroupUserAcc function, make sure you capture this return value:
const foundGroup = search(groups, targetToken); // Replace with your actual user identifier // Now use this foundGroup to update your state
2. Redux State Isn't Being Updated Correctly
If targetGroup is part of your Redux store, you can't directly assign to it—Redux requires immutable updates via dispatched actions. If you're just doing something like targetGroup = foundGroup without dispatching an action, the store won't update, and your component will still see the initial empty object.
Fix Steps:
- Dispatch an action to update the state once you have the search result:
// Example action creator const setTargetGroup = (group) => ({ type: 'SET_TARGET_GROUP', payload: group }); // In your search handler const foundGroup = search(groups, targetToken); dispatch(setTargetGroup(foundGroup || {})); // Fallback to empty object if no match - Check your reducer to ensure it handles the action correctly (using immutable updates):
const initialState = { targetGroup: {} }; function groupReducer(state = initialState, action) { switch (action.type) { case 'SET_TARGET_GROUP': return { ...state, targetGroup: action.payload }; // Spread state to maintain immutability default: return state; } } - Verify component subscription: Make sure your component is using
useSelector(orconnectfor class components) to read the updatedtargetGroupfrom the store:const targetGroup = useSelector(state => state.group.targetGroup);
3. Debugging Tips to Narrow It Down
- Add
console.logstatements in yoursearchfunction to track:- The groups being traversed
- Whether the target user is found in any group
- The return value of each recursive call
- Check if the
groupsparameter passed tosearchis the full nested structure you expect (sometimes Redux state might not be loaded yet when you call the function). - Confirm the user identifier (your
toke...parameter) matches exactly with the user IDs stored in the groups (case sensitivity, string vs number mismatches are common gotchas).
内容的提问来源于stack exchange,提问作者Touchstone

