Здравствуйте, у меня есть эта функция, которая в настоящее время ищет вложенное значение на глубину 3 уровня
// This handle nested data to be applied to filter option which comes from filterProps.prop values
// This is currently chained 3 level deep I.E clock.props.children to add more just keep chaineding
const handleNestFilterProp = (prop: any, item: any, trim?: boolean) => {
return trim
? prop.length === 1
? item[prop[0]] && item[prop[0]].trim().length > 0
: prop.length === 2
? item[prop[0]][prop[1]].trim().length > 0
: prop.length === 3 && item[prop[0]][prop[1]][prop[2]].trim().length > 0
: prop.length === 1
? item[prop[0]] && item[prop[0]]
: prop.length === 2
? item[prop[0]][prop[1]]
: prop.length === 3 && item[prop[0]][prop[1]][prop[2]];
};
Я пытаюсь найти способ уменьшить логику и упростить ее. Я думаю, было бы неплохо использовать get from Lodash
https://lodash.com/docs/4.17.15#get
ОБНОВЛЕНИЕ добавил lodash, чтобы упростить
const handleNestFilterProp = (prop: any, item: any, trim?: boolean) => {
const L1 = _.get(item, prop[0]);
const L2 = _.get(item, [prop[0], prop[1]]);
const L3 = _.get(item, [prop[0], prop[1], prop[2]]);
return trim
? prop.length === 1
? L1 && L1.trim().length > 0
: prop.length === 2
? L2 && L2.trim().length > 0
: prop.length === 3 && L3.trim().length > 0
: prop.length === 1
? L1
: prop.length === 2
? L2
: prop.length === 3 && L3;
};
ОБНОВЛЕНИЕ 2
const handleNestFilterProp = (prop: any, item: any, trim?: boolean) => {
const L1 = _.get(item, prop[0]);
const L2 = _.get(item, [prop[0], prop[1]]);
const L3 = _.get(item, [prop[0], prop[1], prop[2]]);
return prop.length === 1
? trim
? L1.trim().length > 0
: L1
: prop.length === 2
? trim
? L2.trim().length > 0
: L2
: prop.length === 3 && trim
? L3.trim().length > 0
: L3;
};
ОБНОВЛЕНИЕ 3
const handleNestFilterProp = (prop: any, item: any, trim?: boolean) => {
const nest = [prop[0], prop[1], prop[2]];
const L1 = _.get(item, nest.slice(0, 1));
const L2 = _.get(item, nest.slice(0, 2));
const L3 = _.get(item, nest);
return prop.length === 1
? trim
? L1.trim().length > 0
: L1
: prop.length === 2
? trim
? L2.trim().length > 0
: L2
: prop.length === 3 && trim
? L3.trim().length > 0
: L3;
};
2 ответа
const handleNestFilterProp = (prop: string, item: any, trim?: boolean) => {
return trim ? _.get(item, prop).trim().length > 0 : _.get(item, prop);
};
_.get просто берет ‘props.clock.children’ и углубляется независимо от того, насколько глубоко
Для меня использование вложенного условного выражения делает код очень трудным для понимания, я думаю, вам следует использовать if
и switch
заявления для удобочитаемости. Трудно понять, что ваш код возвращает в каждом случае, поэтому я пишу только структуру кода.
const handleNestFilterProp = (prop: any, item: any, trim?: boolean) => {
if (trim) {
switch (prop.length) {
case 1:
break;
case 2:
break;
case 3:
break;
}
} else {
switch (prop.length) {
switch (prop.length) {
case 1:
break;
case 2:
break;
case 3:
break;
}
}
}
};
```