2016-10-26 57 views
0

我天真地写了下面的函数,认为它会帮助我找到一个深入数据结构的对象。但是这不会工作,因为返回范围在foreach内。该函数将始终返回undefined。我应该怎么做?从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; 
      } 
     }); 
    }); 
}; 
+1

使用'for'并从那个返回 – tymeJV

+0

使用'.find()'? – vlaz

+0

对,没有注意到你做到了。 so-o-o,只需将'.forEach'换成'.map' – vlaz

回答

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)); 
} 

它也可以写在同一行,但似乎不太清楚。

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; 
}; 
0

你可以使用Array#some,并返回true结束迭代。您需要一个变量来查找所找到的值。

const findStuff = (data, x) => { 
    let found; 

    data.some(u => 
     u.userData.some(ud => { 
      const s = ud.stuff.find(s => s.id === x.id); 
      if (s) { 
       found = s; 
       return true; 
      } 
     }) 
    ); 
    return found; 
};