Javascript: уменьшение избыточности вложенного значения нотации

Здравствуйте, у меня есть эта функция, которая в настоящее время ищет вложенное значение на глубину 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 ответа
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;
                    
            }
            }
        }
    };
    ```
    

    • 2

      (Вложенные switch (prop.length) { смотрит не только из-за его отступов. И CR @ SE все еще хочет новую строку после закрытия кодовый забор.)

      — седобородый

    Добавить комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *