我天真地编写了以下函数,认为它可以帮助我找到数据结构深处的对象。但这是行不通的,因为返回的范围在 foreach 内。该函数将始终返回未定义。我应该怎么做?
const findStuff = (data, x) => {
data.forEach(u => {
u.userData.forEach(ud => {
const s = ud.stuff.find(s=>s.id === x.id);
if (s){
return s;
}
});
});
};
最佳答案
我认为你的做法是错误的。那是......太多的代码。我创建了一个似乎符合您正在查看的数据的对象:
var data = [
{
username: "Alice",
userData : [
{
id: 1,
someData: "hello"
},
{
id: 2,
someData: "world"
}
]
},
{
username: "Bob",
userData : [
{
id: 3,
someData: "apple"
},
{
id: 4,
someData: "orange"
}
]
}
];
const findStuff = (data, lookup) => {
return data.find(
item => item.userData.some(
userDataItem => userDataItem.id === lookup.id
)
);
}
const shouldGetAlice = findStuff(data, {id: 1});
const shouldBeAliceAgain = findStuff(data, {id: 2});
const shouldGetBob = findStuff(data, {id: 3});
const shouldBeAnotherBob = findStuff(data, {id: 4});
console.log(shouldGetAlice.username);
console.log(shouldBeAliceAgain.username);
console.log(shouldGetBob.username);
console.log(shouldBeAnotherBob.username);
从.find()
开始因为您想要获得单个项目。
在回调中,您使用 .some()
检查 userData
属性,而不是自己循环遍历它们。
就是这样。您不需要手动循环每个数组。
如果删除描述性变量名称,函数可以缩短为
const findStuff = (data, x) => {
return data.find(u => u.userData.some(ud => ud.id === x.id));
}
也可以写成一行,但似乎不太清楚。
关于javascript - 从 forEach 中返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40271761/