在CoffeeScript中初始化数组的最智能方法

时间:2013-08-30 22:02:58

标签: syntax coffeescript

在咖啡脚本中初始化具有特定值0的数组的最佳方法是什么。到目前为止我做了什么 -

[0..100].map -> 0

并且

arr = []
arr.push(0) while arr.length isnt 100

如果个人认为第一个表现不佳而第二个表现得过于冗长并破坏了咖啡脚本编程的魅力。

更新2: Incase性能不是问题,那么我认为这也是一个选择。

arr = new Array(10).join(0).split('')

更新2:如果加入了number

,上述内容将比其他选项更好

更新3:在看到评论和答案中提到的几个JSPerf tests后,我尝试使用node.js自行执行这些操作。以下是奇怪的结果 - 代码 -

    size = 10000000;
key = 1

console.time('splits')
arr1= Array(size + 1).join(key).split('')
console.timeEnd('splits')


console.time('maps')
arr2 = [1..size].map -> key
console.timeEnd('maps')

console.time('loop')
arr3 = []
arr3.push(key) while arr3.length isnt size
console.timeEnd('loop')


console.time('for')
arr4 = (0 for n in [0...size])
console.timeEnd('for')

console.time('for-no-var')
arr5 = (0 for [0...size])
console.timeEnd('for-no-var')


### node- 0.10.15
splits: 162ms
maps: 1639ms
loop: 607ms
for: 659ms
###

有趣的是,拆分和加入所花费的时间要少得多。此外,如果我们真的关心性能,那么我们应该尝试初始化和数组,这是非常大而不是大约数百个。

3 个答案:

答案 0 :(得分:15)

如果您不希望任何迭代变量泄漏到理解之外,还有arr = (0 for [1..100])形式;)

答案 1 :(得分:5)

我的投票结果为arr = (0 for x in [0...100])

明确,简洁,CoffeeScript-ish,并编译以合理地清除Javascript:

var arr, x;

arr = (function() {
  var _i, _results;
  _results = [];
  for (x = _i = 0; _i < 100; x = ++_i) {
    _results.push(0);
  }
  return _results;
})();

答案 2 :(得分:1)

以下是问题/评论

中提到的每个选项的效果比较

http://jsperf.com/array-initialization-in-coffeescript

对我来说,Chrome 28

arr = []
arr.push(0) while arr.length isnt 100

是最快的

[0..100].map -> 0

是最慢的。

也就是说,最慢的是100k ops / sec。由于初始化应该是一种相对不常见的操作,我认为可以肯定地说这里的性能不如可读性重要。

就个人而言,我发现推送版本和地图版本的可读性最高,但这应该是您和其他任何人将使用/阅读此代码的决定。