我天真地编写了以下函数,认为它可以帮助我找到一个深入数据结构的对象。但这不会起作用,因为返回的范围是在foreach中。该函数将始终返回undefined。我该怎么做?
"target": "es5",
"module": "commonjs",
"moduleResolution": "node"
答案 0 :(得分:1)
我认为你的做法是错误的。这是......很多代码。我创建了一个似乎符合您正在查看的数据的对象:
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));
}
它也可以写在一行,但似乎不太清楚。
答案 1 :(得分:0)
在闭包顶部使用变量,并在forEach
之后返回。
const findStuff = (data, x) => {
let found;
data.forEach(u => {
u.userData.forEach(ud => {
const s = ud.stuff.find(s=>s.id === x.id);
if (s){
found = s;
}
});
});
return found;
};
答案 2 :(得分:0)
您可以使用Array#some
并以返回KTL
结束迭代。您需要一个变量用于找到的值。
true