如何高效地将数组按值进行划分?

6

我想知道,将数组除以一个标量的最有效方法是什么?我可以使用循环来实现,但效率对我来说非常重要。

常见的琐碎方法:

var array_2 = []
var array_1 = [original_data
var divisor = my_scalar
for(var i = 0, length = array.length; i < length; i++){
            array_2.push(array[i]/divisor)
         }

有什么诀窍可以使用(或完全新的方法)?

2
var array_2 = array_1.map(i => i / divisor); - tymeJV
立刻尝试,很酷。 - Asher11
2
请注意,您通常使用的简单方法可能更有效(这取决于您所使用的JavaScript引擎):array_2[i] = array[i] / divisor(而不是push)。 - T.J. Crowder
1
这篇关于单指令多数据(SIMD)数学运算的回答描述了一种可能更有效的方法,但似乎并没有得到广泛支持。除此之外,无论是使用map还是仅使用循环提供的所有解决方案在效率上通常都是相同的。 - Justin Hellreich
@JustinHellreich:不错!我一直在想是否有一些优化可以使用SIMD,但没有意识到实际上已经为此定义了API。 - user1106925
显示剩余6条评论
3个回答

6
您说您想要最有效的方法。相信您做得很接近了,但是您需要赋值而不是push,并且在至少一些JavaScript引擎(例如V8,在Chromium浏览器中),如果您告诉Array构造函数一个初始长度,它们将预先分配后备存储(即使数组没有任何元素):
var array_2 = Array(array.length);
for(var i = 0, length = array.length; i < length; i++){
    array_2[i] = array[i] / divisor;
}

话虽如此:mapthat 之间的差别非常小,而这种情况很少会有人关心。相比之下,map 更为明确、简单和简短...


1
实话实说,对答案的迅速和精确感到不知所措!会尝试两者。 - Asher11

3
您可以使用map来实现这个功能:
var newData = data.map(function(item) { return item/scalar } )

这是一个非常非常非常非常非常非常非常微小的差别,而不是更高效。 - T.J. Crowder

2
const numbers = [350,451,758,456,999];
const dividedNum = num => num/7;
const output1 = numbers.map(dividedNum);
console.log(output1)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接