5

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

[0..100].map -> 0

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

如果个人觉得第一个会表现不佳,而第二个太冗长,破坏了咖啡脚本编程的魅力。

更新 2: 如果性能不是问题,那么我想这也是一个选项。

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

更新 2:如果加入通过,上述将比其他选项执行得更好number

更新 3:在看到评论和答案中提到的几个JSPerf 测试后,我尝试使用 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
###

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

4

3 回答 3

17

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

于 2013-09-01T00:02:41.300 回答
5

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

它清晰、简洁、CoffeeScript 风格,并且可以编译为相当清晰的 Javascript:

var arr, x;

arr = (function() {
  var _i, _results;
  _results = [];
  for (x = _i = 0; _i < 100; x = ++_i) {
    _results.push(0);
  }
  return _results;
})();
于 2013-08-31T22:03:59.003 回答
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。由于初始化应该是一个相对不常见的操作,我认为可以肯定地说这里的性能不如可读性重要。

就我个人而言,我发现推送版本和地图版本是最易读的,但这应该是你和其他将使用/阅读此代码的人做出的决定。

于 2013-08-31T20:57:40.460 回答