当前位置: 首页 > 知识库问答 >
问题:

如何在javascript中优化代码

韦高谊
2023-03-14

我认为代码(如下)已经优化(只需使用比相同逻辑的初始版本更少的变量

>

在优化过程中,我应该考虑哪些因素?

这是代码(也在jsfiddle上)

function process(arr){
  var processed = [];
  for(var i=0,len=arr.length;i<len;i++){
      if(processed.indexOf(arr[i]) < 0){
          var nodes = findIndexes(arr,arr[i]);
          if(nodes.length > 1){
              for(var j=0,jlen=nodes.length;j<jlen;j++){
                arr[nodes[j]] = arr[nodes[j]] + '(' + ( j + 1 ) + ')';
            }
          }
          processed.push(arr[i]);
      }
   }
   return arr;
 }

function findIndexes(arr,val){
  var node = [];
  for(var i=0,len=arr.length;i<len;i++){
      if(arr[i] === val){
          node.push(i);
      }
  }
  return node;
}

// input
var arr = ['aa','bb','bb','aa','cc','dd','cc','ff']

console.log(process(arr));
//output: ["aa(1)", "bb(1)", "bb(2)", "aa(2)", "cc(1)", "dd", "cc(2)", "ff"]


这是代码的解释。“处理”函数在数组中查找相同的值,对于每个相同的值,它通过将一个数字挂起到该值来更改值,“数字”表示它在数组中找到的值的计数。
例如arr=["x","x","y","z"]将返回["x(1)","x(2)","y","z"]"y"和"z"不变,因为它们只出现过一次。

为了优化,我使用了一个名为已处理的数组,用于保存刚刚在main for循环中处理的值,因此在下一次迭代中可以确定通过检查array.indexOf方法,新的迭代值是否已经被处理,如果该值已经被处理,那么它可以安全地跳过底层逻辑(if/for语句)。

现在除了改变整个过程逻辑之外,我不知道如何进一步优化它。

共有3个答案

任元青
2023-03-14

还有一种以更少的更改优化代码的方法:

在您的特定情况下,您将遍历每个新找到的条目的整个数组,尽管之前的所有条目都已被处理,因此应该可以通过将当前索引传递给FindIndex来进一步优化:

function findIndexes(arr,val, fromIndex){
  var node = [];
  for(var i=fromIndex,len=arr.length;i<len;i++){
      if(arr[i] === val){
          node.push(i);
      }
  }
  return node;
}
赖明煦
2023-03-14

您可以在单个循环中完成:

function process2(arr) {
    var out = arr.slice(0),
        seen = {},
        len = arr.length,
        i, key, item, count;

    for (i = 0; i < len; ++i) {
        key = out[i];
        item = seen[key];
        if (!item) {
            // firstIndex, count
            seen[key] = item = [i, 0];
        }
        count = ++item[1];
        if (count > 1) {
            if (count === 2) {
                out[item[0]] = key + '(1)';
            }
            out[i] = key + '(' + count + ')';
        }
    }
    return out;
}

// input
var arr = ['aa', 'bb', 'bb', 'aa', 'cc', 'dd', 'cc', 'ff']

console.time('p2');
console.log(process2(arr));
console.timeEnd('p2');

从基准测试来看,流程2大约比流程1快2倍。这只是一个真正天真的问题的第一步。

翟光赫
2023-03-14

广义的优化将涉及简化代码、预计算重复重用的结果,以及组织代码以便重用更多的结果。

您的fiddle代码在分析时产生了以下结果。

Logical LOC: 26
Mean parameter count: 3
Cyclomatic complexity: 7
Cyclomatic complexity density: 27%
Maintainability index: 104

代码行数(LOC)–表示代码中的大致行数。计数基于IL代码,因此不是源代码文件中的确切行数。非常高的计数可能表示某个类型或方法正在尝试执行太多的工作,应该进行拆分。它还可能表明该类型或方法可能很难维护。

可维护性指数–计算一个介于0和100之间的指数值,表示代码维护的相对容易程度。高值意味着更好的可维护性。颜色编码评级可用于快速识别代码中的故障点。绿色等级介于20和100之间,表示代码具有良好的可维护性。黄色评级介于10和19之间,表示代码具有适度的可维护性。红色等级是介于0和9之间的等级,表示可维护性低。

圈复杂度–衡量代码的结构复杂度。它是通过计算程序流中不同代码路径的数量来创建的。具有复杂控制流的程序将需要更多的测试来实现良好的代码覆盖率,并且维护性较差。

使用javascript代码的在线工具检查代码的复杂性。

参考:链接1,链接2

Javascript优化程序页面

参考(为您提供优化时应牢记的不同技巧)

 类似资料:
  • 如何在PHP Smarty中优化这段代码? 现在我有一个代码让我困惑,有一个简单的代码。 当我搜索需要推送值的代码时。 优化如何发挥作用?我能写到数组吗?如果它可以写入数组,我该怎么办?

  • 了解如何在 Dreamweaver 中清除代码、检查浏览器兼容性、验证 XML 文档并使页面符合 XHTML 规范。 清理代码 您可以自动删除空标签,合并嵌套 font 标签,以及通过其它方法改善杂乱或难以辨识的 HTML 或 XHTML 代码。 有关如何清理从 Microsoft Word 文档生成的 HTML 的信息,请参阅打开和编辑现有文档。 在打开的文档中,选择“工具”>“清理 HTML”

  • 问题内容: 我正在使用此代码来检测图像中的绿色。 问题在于此迭代确实很慢。 如何使其更快?如果使用的是numpy,如何以numpy的方式进行? 问题答案: 简单尝试一下:

  • JavaScript代码优化 1、慎用全局变量 为什么要慎用全局变量原因如下 1、全局变量定义在全局执行上下文,是所有作用域链的顶端 2、全局执行上下文一直存在于上下文执行站,直到程序退出 3、如果某个局部作用域出现了同名变量则会遮蔽或污染全局 2、缓存全局变量 其实就是在程序执行过程中,将使用中无法避免的全局变量缓存到局部 代码演示如下 1、普通写法: function getBt

  • 如何将两个方法合并成一个方法 如图parentValues = ['BC', 'BC-SRV', 'BC-SRV-COM'], 想得到的是选中的树组arrSelectedFacets = ['BC-SRV-COM-FTP', 'BC-SRV-COM-TEL'] 如果 BC-SRV-COM 下的子节点都选中,则arrSelectedFacets=['BC-SRV-COM']

  • 因为 a.pinyin[0] 的原因,我不知道怎么用 a[..] 的方式简化代码 谢谢