【问题标题】:More efficient or concise method for this function?此功能更有效或更简洁的方法?
【发布时间】:2023-04-04 15:52:01
【问题描述】:

我有一组可以在锻炼时完成的练习数据集,格式为 JSON。我正在对这些数据实施一个过滤系统,它具有用户可以应用的三种不同类型的过滤器:排序过滤器(它采用当前的一组练习并按名称 az 对它们进行排序,反之亦然),肌肉群(下降的练习)在同一目标肌肉群下)和训练计划(属于同一训练计划的运动)。

用户应该能够选择任何过滤器,并且会立即应用它,但并非必须应用所有 3 种类型的过滤器。因此,我在 JS 中提出了以下功能:

function applyFilters(filters) {
  const sort = filters[0];
  const muscles = filters[1];
  const programs = filters[2];
  const exerciseJSONData = "exercises.json";

  $.getJSON(exerciseJSONData, {
    format: JSON,
  }).done(function (result) {
    let filteredArr = [];
    if (muscles.length === 0 && programs.length === 0) {
      filteredArr = result;
    } else if (muscles.length !== 0 && programs.length === 0) {
      $.each($(result), function (key, val) {
        if (muscles.some((item) => val.MainMuscleGroup.indexOf(item) >= 0)) {
          filteredArr.push(this);
        }
      });
    } else if (muscles.length === 0 && programs.length !== 0) {
      $.each($(result), function (key, val) {
        if (programs.some((item) => val.TrainingProgram.indexOf(item) >= 0)) {
          filteredArr.push(this);
        }
      });
    } else {
      $.each($(result), function (key, val) {
        if (
          muscles.some((item) => val.MainMuscleGroup.indexOf(item) >= 0) &&
          programs.some((item) => val.TrainingProgram.indexOf(item) >= 0)
        ) {
          filteredArr.push(this);
        }
      });
    }
    $("#number-of-exercises").text(filteredArr.length + " Exercises Found");
    $("#exercises").empty();
    createExerciseHTML(filteredArr);
  });
}

此函数按预期工作,但是,我认为 if else 语句的可读性对其他人来说可能难以理解,并且违反了不重复代码的规则。我想知道是否有一种更简洁有效的方法来编码这个函数?提前致谢。

附:抱歉,如果本文开头的信息过多,我想提供一些背景信息以避免读者可能产生的任何混淆。

【问题讨论】:

  • 你听说过Code Review吗?稍加编辑,您的问题会比 Stack Overflow 更适合。请务必在发帖前使用他们的tour 并阅读他们的How To Ask
  • @PedroLima 很遗憾关闭选项,在 SO 中没有代码审查选项,我认为 SO Dev 可以添加它。
  • @Keith 我部分同意。关闭建议另一个 Stack Exchange 站点的选项通常会导致问题被自动转移到目标站点。问题是 Code Review 的指南描述了一种非常受限的问题格式。比 Stack Overflow 更受限制。例如,这个问题不遵循 Code Review 的指导方针,如果直接转移,很可能会被标记在那里。这就是为什么我建议 OP 在发布之前阅读 Tour 和 How To Ask,因为这个问题需要先编辑。
  • @Keith 我不同意,因为有很多人们在不合适的时候建议 CR。但是,在这种情况下,情况绝对不是这样。
  • @Keith 在理论上,是的。在实践中,我仍然期望有太多错误的投票会导致太多错误的迁移。请记住,启动迁移只需三票,一旦投出一票,其他人将无能为力。你不能对迁移投票反对,所以更多的是when,而不是if,来决定帖子是否会再获得两票来自可能不是迁移目标站点专家的用户,他们没有意识到问题将在那里关闭。 TBH,整个迁移系统很糟糕。

标签: javascript jquery code-formatting


【解决方案1】:

您可以先取出 $each 并将 if 保留在 each 中。

function applyFilters(filters) {
   const sort = filters[0];
   const muscles = filters[1];
   const programs = filters[2];
   const exerciseJSONData = "exercises.json";
   
   $.getJSON(exerciseJSONData, {
      format: JSON,
   }).done(function (result) {
      let filteredArr = [];
      var hasMuschle = muscles.length > 0 ? 1 : 0;
      var hasProgram = programs.length > 0 ? 1 : 0;
      var muscleAndProgram = hasMuschle - hasProgram;
      $.each($(result), function (key, val) {
         
         if (muscles.length === 0 && programs.length === 0) {
            filteredArr = result;
         } else if (muscles.length !== 0 && programs.length === 0) {
            if (muscles.some((item) => val.MainMuscleGroup.indexOf(item) >= 0)) {
               filteredArr.push(this);
            }
         } else if (muscles.length === 0 && programs.length !== 0) {
            if (programs.some((item) => val.TrainingProgram.indexOf(item) >= 0)) {
               filteredArr.push(this);
            }
         } else {
            if (
               muscles.some((item) => val.MainMuscleGroup.indexOf(item) >= 0) &&
               programs.some((item) => val.TrainingProgram.indexOf(item) >= 0)
               ) {
                  filteredArr.push(this);
               }
            }
         })
         $("#number-of-exercises").text(filteredArr.length + " Exercises Found");
         $("#exercises").empty();
         createExerciseHTML(filteredArr);
      });
   }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-28
    • 2012-05-08
    • 1970-01-01
    • 1970-01-01
    • 2020-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多