Вот обратный вызов (слегка измененный/упрощенный для целей этого вопроса), который я написал для обработки некоторых данных объекта.Сглаживание вложенного обратного вызова
function (err, data) {
var rv;
if (data && data.result instanceof Array) {
rv = data.result.map(function (value) {
if (value && value.track_contributions instanceof Array) {
return value.track_contributions.map(function (innerValue) {
if (innerValue && innerValue.track) {
return innerValue.track.mid;
}
});
}
});
// flatten nested arrays
rv = [].concat.apply([], rv);
}
console.log(rv);
};
Вот что объект, который я обработки выглядит следующим образом:
{
"result": [
{
"type": "/music/artist",
"track_contributions": [
{
"track": {
"mid": "/m/015rm3l"
}
},
{
"track": {
"mid": "/m/0nm2km"
}
},
{
"track": {
"mid": "/m/010ksbq"
}
},
...
]
}
]
}
И я хочу, возвращаемое значение из моего обратного вызова, который выглядит следующим образом:
[ '/m/015rm3l',
'/m/0nm2km',
'/m/010ksbq',
...
]
Мой код работает просто отлично, но я чувствую, что все это вложение - это запах кода.
Как я могу сделать этот тип кода более лёгким, более читаемым и поддерживаемым, и все это замечательно? Обещания? Некоторые утилиты типа lodash? Что-то другое? Все вышеперечисленное?
Этот подход приведет к множеству «неопределенных» значений, если условия в функциях 'map' неверны. Потому что в тех случаях ничего не возвращается. – Amberlamps
@Amberlamps Правильно. Мой код ожидает этого. Но да, стоит отметить! – Trott