Javascript 如何在嵌入对象中查找项的位置
在我的项目中,我有一个查询,返回一个轮次列表 轮次和门店之间存在一对多关系,这意味着门店有许多轮次需要填满。此外,用户可以有多个回合。以下是这些对象的形状:Javascript 如何在嵌入对象中查找项的位置,javascript,reactjs,typescript,Javascript,Reactjs,Typescript,在我的项目中,我有一个查询,返回一个轮次列表 轮次和门店之间存在一对多关系,这意味着门店有许多轮次需要填满。此外,用户可以有多个回合。以下是这些对象的形状: interface UserInterface { id: string; fullName: number; user: AuthUser; turns: Turn[]; } interface StoreInterface { name: string; turns: Turn[]; user: UserIn
interface UserInterface {
id: string;
fullName: number;
user: AuthUser;
turns: Turn[];
}
interface StoreInterface {
name: string;
turns: Turn[];
user: UserInterface;
}
interface Turn {
id: string;
fullfilled: boolean;
user: UserInterface;
store: StoreInterface;
}
我的目标是,给定查询结果(轮次列表)和用户ID,找出用户在队列的哪个位置。我尝试了这个解决方案:
const getTurnPosition = (): number => {
let turnPosition: number;
data.getTurnsForUser.map((turn: Turn) => {
const turnList = turn.store.turns.filter(
(turn) => turn.fullfilled === false
);
const myTurn = turnList.find(
(turn: Turn) => turn.user.user.id === userId
);
if (myTurn) {
turnPosition = turnList.indexOf(myTurn);
return turnPosition;
}
});
};
正如您所看到的,我需要首先去掉已经充满filter()
方法的回合。然后,我使用find()
但是这种方法存在一个问题:即使当我看到正确的索引时,console.log(turnPosition)
,函数仍返回undefined
。Typescript也警告我这一点
我对这个很迷茫。我做错了什么
PD:这是完整查询(graphQL)的一个示例:
您正在map
函数中返回,但实际上从未从getTurnPosition()
函数中返回任何内容,这就是它显示未定义的原因。您可以将其更改为如下所示:
const getTurnPosition = (userId: number): number => {
for (let turn of data.getTurnsForUser) {
const unfulfilledTurns = turn.store.turns.filter(
(t) => t.fulfilled === false
);
return unfulfilledTurns.findIndex((t) => t.user.id === userId);
}
};
这是因为这是您感兴趣的,但也只是在找到某个顶级回合中发现的第一个未完成回合的第一个索引时立即返回
如果您确实需要每个存储
转弯位置的索引数组,则需要返回地图
,但您可能需要一些额外的标识信息,该转弯索引所指的存储
const getTurnPosition = (userId: number): number => {
return data.getTurnsForUser.map(turn => {
const unfulfilledTurns = turn.store.turns.filter(
(t) => t.fulfilled === false
);
return unfulfilledTurns.findIndex((t) => t.user.id === userId);
});
};
谢谢你的回答!我明天试试看
const getTurnPosition = (userId: number): number => {
return data.getTurnsForUser.map(turn => {
const unfulfilledTurns = turn.store.turns.filter(
(t) => t.fulfilled === false
);
return unfulfilledTurns.findIndex((t) => t.user.id === userId);
});
};