Javascript 提高此方法的性能以展平阵列

Javascript 提高此方法的性能以展平阵列,javascript,algorithm,performance,internet-explorer,Javascript,Algorithm,Performance,Internet Explorer,我正在开发一个大型javascript应用程序,毫不奇怪在IE11中它真的很困难(Chrome=8秒,nodejs=8秒,IE11=35秒) 所以我做了一些分析,发现这个方法是我的时间接收器。我已经做了所有我能想到的改变——还有其他的性能改进吗 const flatten = function(arr, result) { if (!Array.isArray(arr)) { return [arr]; } if(!result){ result = []; }

我正在开发一个大型javascript应用程序,毫不奇怪在IE11中它真的很困难(Chrome=8秒,nodejs=8秒,IE11=35秒)

所以我做了一些分析,发现这个方法是我的时间接收器。我已经做了所有我能想到的改变——还有其他的性能改进吗

const flatten = function(arr, result) {
  if (!Array.isArray(arr)) {
    return [arr];
  }

  if(!result){
    result = [];
  }

  for (let i = 0, length = arr.length; i < length; i++) {
      const value = arr[i];
      if (Array.isArray(value)) {
        flatten(value, result);
      } 
      else {
        result.push(value);
      }
  }

  return result;
  };
const flatte=函数(arr,结果){
如果(!Array.isArray(arr)){
返回[arr];
}
如果(!结果){
结果=[];
}
for(设i=0,length=arr.length;i
使用较小的数组(最多10个字符串项,深度不超过2级)多次调用该方法。

执行
if(!result)
数组。应避免重复检查isArray(value)
。我会去的

function flatten(arr, result = []) {
  if (Array.isArray(arr)) {
    for (var i = 0; i < arr.length; i++) {
      flatten(arr[i], result);
    }
  } else {
    result.push(arr);
  }
  return result;
}
应避免重复执行
if(!result)
Array.isArray(value)
检查。我会去的

function flatten(arr, result = []) {
  if (Array.isArray(arr)) {
    for (var i = 0; i < arr.length; i++) {
      flatten(arr[i], result);
    }
  } else {
    result.push(arr);
  }
  return result;
}

在我看来,使用递归的方式有点奇怪:返回数组并根据深度级别修改参数。您还有重复的
Array.isArray(Array)
调用。我认为这段代码可以相当简化,例如,可以简化为以下内容(如您所见,没有参数变化):

常数展平=(数组)=>array.isArray(数组)
? array.reduce((累计,值)=>累计.concat(展平(值)),[])
:[数组];

老实说,我不确定性能是否会有那么大的提高,但在我看来,它看起来更优雅——它是你的朋友

使用递归的方式在我看来有点奇怪:返回数组并根据深度级别修改参数。您还有重复的
Array.isArray(Array)
调用。我认为这段代码可以相当简化,例如,可以简化为以下内容(如您所见,没有参数变化):

常数展平=(数组)=>array.isArray(数组)
? array.reduce((累计,值)=>累计.concat(展平(值)),[])
:[数组];


老实说,我不确定性能是否会有那么大的提高,但在我看来,它看起来更优雅——它是你的朋友

一些JavaScript引擎比数组[array.length]=n
更快地执行数组.push(n),而另一些则相反。您可以检查IE中哪个是正确的,然后使用它发现的更快的一个。@T.J.Crowder-谢谢您的评论
push()
在所有的浏览器(比如Chrome和nodejs)中似乎都更快…好的。(Chrome和Node.js是一样的并不奇怪——它们使用相同的JavaScript引擎,V8。)一些JavaScript引擎比
array.push(n)
快,而另一些则相反。您可以检查IE中哪个是正确的,然后使用它发现的更快的一个。@T.J.Crowder-谢谢您的评论
push()
在所有的浏览器(比如Chrome和nodejs)中似乎都更快…好的。(Chrome和Node.js是一样的,这并不奇怪——它们使用相同的JavaScript引擎,V8。)如果试图弥补每一点性能,可能值得将
Array.isArray
缓存到本地。@LeonardoSeccia如果您使用的是transpiler,您可能应该用普通的ES5编写性能敏感的代码,以便对代码进行精确控制。@Bergi:是的,(尽管它对IE11有一点影响,而IE11对OP来说是有问题的,所以…)。Bergi+@T.J.Crowder-谢谢。您的建议加快了23%:@Bergi-是的,不幸的是,在应用程序中,我没有看到太多的性能提升。。。但是它还是有一点好,尽管如此……如果试图弥补每一点性能,可能值得将
Array.isArray
缓存到本地。@LeonardoSeccia如果您使用的是transpiler,您可能应该用普通ES5编写对性能敏感的代码,以便对代码进行精确控制。@Bergi:是的,(虽然它对IE11的影响很小,但对于OP来说,IE11是有问题的,所以…).Bergi+@T.J.Crowder-谢谢。您的建议加快了23%:@Bergi-是的,不幸的是,在应用程序中,我没有看到太多的性能提高…但是它稍微好一点,尽管如此…使用
concat
创建和丢弃大量中间数组并不会提高时间性能。@sp00m-我给出了你为试图提供帮助付出了+1的努力,但jsPerf也是你的朋友…这真的会扼杀性能…@LeonardoSeccia是的,好吧,只是想与你分享这个工具,以防你想对你收到的解决方案进行基准测试;)使用
concat
创建和丢弃大量中间数组并不能提高时间性能。@sp00m-我给了你+1分,以感谢你的帮助,但jsPerf也是你的朋友。。。这真的会扼杀性能…@LeonardoSeccia是的,好吧,我只是想与您分享这个工具,以防您想对您收到的解决方案进行基准测试;)
function flatten(val) {
  if (!Array.isArray(val)) return [val]; // omit this check if you can
  var result = [];
  for (var i = 0, ilen = arr.length; i < ilen; i++) {
    var val = arr[i];
    if (Array.isArray(val)) {
      for (var j = 0, jlen = val.length; j < jlen; j++) {
        // as deep as you need it
        result.push(val[j]);
      }
    } else {
      result.push(val);
    }
  }
  return result;
}