Javascript:在For循环中,显式设置结构值或临时变量是否更好?

时间:2017-01-25 17:06:52

标签: javascript angularjs json typescript

使用带有Angular JS的Typescript,有时我会在循环中创建一个临时变量来设置一个值。 我正在循环JSON响应并确定我想要显示的项目。项目有一些变量可以确定它们是否会显示在前端。 具体来说,这是一项调查。如果调查没有完成,我只想显示活动的问题,但如果完成,我想只显示有答案的问题(这些问题可能是"非活动" [已删除]问题。 )

示例JSON响应:

{
  "surveyId": 2,
  "completed": false
  "questions" : [ {
    "id" : 1111,
    "question": "Blah blah blah blah ?",
    "answer": null
  }, 
  {
    "id" : 1112,
    "question" : "Yes no no no yes?",
    "answer": 1,
    "active": true
}

处理控制器中的响应数据:

myService.getSurvey(vm.id)
  .success(function(data: any) {
    ...
    let questionableJSON: {id: number, question: string, answer: number}[] = [];
    for (let obj of data.questions)  {
      //comparing how i do this: set a "temp" variable to use:
      let answerNum: number = 1;
      //this is only checking for "falsey" not undefined or null -- that is unimportant for the sake of this question
      if (obj.answer) {
        answerNum = obj.answer;
      }
      //vs. way #2: just checking if the var exists and setting it
      if (angular.isUndefined(obj.active)) {
        obj.active = true;
      }
      //now push to the temp JSON structure:
      if (data.completed && obj.answer) {
        questionableJSON.push({
          id: obj.id,
          question: obj.question,
          answer: answerNum
        });
      }
      else if (!data.completed && obj.active) {
        questionableJSON.push({
          id: obj.id,
          question: obj.question,
          answer: answerNum
        });
      }
    }
  });
  //now set our controller question data to our newly obtained data populated in our temp JSON from the response:
  vm.questions = questionableJSON;

问题是:为obj.active设置临时变量是否更好,就像我为answerNum设置临时变量一样?或者更好的是直接前进并将obj.active设置为值而不是为循环的每次迭代声明另一个临时变量?哪些做法更清洁或更有效?这与普通的javascript一样,这个功能与常规JS没什么不同。这不是以任何方式特定于Angular的。

第二部分问题,如果这还不够,将if.. else if合并到带有||的一个if语句中会更有效率吗像:

if (data.completed && obj.answer || !data.completed && obj.active)

由于

1 个答案:

答案 0 :(得分:0)

你问的问题,"它是否更好,"这可以从许多有利位置来解释。我将把你的问题解释为,"什么是最有效的?"

参考this question,似乎let - 范围变量在循环体级别中作用域,这意味着在循环体内声明的变量将在每个循环体运行后立即进行垃圾收集。从这个角度来看,只要您从调查api返回的数据集长达数十万个结果,它就没有任何区别。创建一个仅存在于循环体范围内的布尔变量的性能肯定与api调用本身解析所需的时间相比并不重要。

然而,就像布鲁诺在评论中提到的那样,它可能更具可读性和可维护性,只是简单明了一下。虽然你的问题不是关于可读性,但它是关于什么更好,"其中恕我直言包括代码可读性。