2016-10-26 2 views
0

Я наивно написал следующую функцию, думая, что это поможет мне найти объект, который находится глубоко в структуре данных. Но это не будет работать из-за возвращения, охваченного внутри foreach. Функция всегда будет возвращена не определена. Как я должен это делать?Возвращение изнутри 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; 
}; 
Смежные вопросы