Я думаю, что ваш подход неправильный. Это ... много кода. Я сделал объект, который, кажется, чтобы соответствовать данным вы смотрите через:
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));
}
Он также может быть написано на одной линии, но это кажется менее ясно.
Используйте регулярные 'for' и возвращайтесь с этого – tymeJV
Используйте' .find() '?? – vlaz
Правильно, не заметил, что ты это сделал. So-o-o просто поменяйте свой '.forEach' на' .map' – vlaz