2015-05-03 139 views
1

我希望能够从[2, 3]3 : [2, 3, 2, 3, 2, 3]获得。 (如3 * a在Python中,其中a是一个列表)有没有一种快速有效的方法来在Javascript中乘数组?

有没有一种快速和有效的方式来做到这一点在Javascript? 我用for循环来做到这一点,但它缺乏可视性,我猜效率。

我希望它能够处理每种类型的元素。

例如,我使用的代码:

function dup (n, obj) { 
var ret = []; 
    for (var i = 0; i<n; i++) 
    { 
     ret[i] = obj; 
    } 
    return (ret); 
} 

的问题是,它不与数组或对象工作,只与原始值。

我必须做出条件,还是有一种干净的方式来复制变量?

+5

我不明白一环是如何“缺乏可见性和效率。” – JJJ

+0

请更好地描述。如果for循环效率低下,我不会真正解决您的问题。我不是这样的Python专家。 – jPO

+0

如果你想用同样的数字多重所有条目,你可以使用'array.prototype.map',如果你想让它们全部乘以'array.prototype.reduce'。然而,在JavaScript中使用循环实际上是最快的方法。 – Mouser

回答

-2

没有。这是一个非常Pythonic的想法。

你可以设计一个函数来做到这一点,但我怀疑是否有任何计算上的好处,因为你只是使用循环或者一些奇怪的滥用字符串函数。

+2

问题是关于JavaScript,而不是PHP。 – JJJ

+0

谢谢,我已经删除了PHP的参考。我感到困惑:P – braks

+0

它不工作,如果数组像[23,23] – Grundy

1

可以使用此(非常可读:P)函数:

function repeat(arr, n){ 
    var a = []; 
    for (var i=0;i<n;[i++].push.apply(a,arr)); 
    return a; 
} 

repeat([2,3], 3)返回一个数组[2, 3, 2, 3, 2, 3]

基本上,它是这样的:

function repeat(array, times){ 
    var newArray = []; 
    for (var i=0; i < times; i++){ 
    Array.prototype.push.apply(newArray, array); 
    } 
    return newArray; 
} 

我们推array的值设置到newArraytimes倍。为了能够将一个数组作为它的值(因此,push(2, 3)而不是push([2, 3]))我使用apply,它接受一个数组并将它作为参数列表传递。

或者,延伸的原型:

Array.prototype.repeat = function(n){ 
    var a = []; 
    for (var i=0;i<n;[i++].push.apply(a,this)); 
    return a; 
} 

[2, 3].repeat(3)返回一个数组[2, 3, 2, 3, 2, 3]

如果你想要的东西相当可读的,你可以在一个循环中使用concat

function repeat(array, n){ 
    var newArray = []; 
    for (var i = 0; i < n; i++){ 
    newArray = newArray.concat(array); 
    } 
    return newArray; 
} 
+1

他的方式缺乏知名度。你的方式是隐藏的。 xD –

+0

@OmarElawady这是因为我是忍者!我不知道,也许像'repeatTimesMany'这样的更好的名字可能会使它更清晰? – theonlygusti

+1

这不是关于name.' [i ++]。push.apply(a,this)'是非常复杂的,你可以像循环内的'a = a.concat(arr)'那样做。可以看到它xD –

相关问题