在javascript或php中创建重复数组的最有效(紧凑)方法?

时间:2015-09-05 09:58:31

标签: javascript php arrays repeat

假设我需要一个包含许多重复元素的数组,如下所示:

[3,3,3,3,3,8,8,8,8,5,5,5,5,5,5](这样五个3s,4个8s和6个5s)

在python中,你可以非常优雅地定义它:

[3]*5+[8]*4+[5]*6

JS或PHP中是否有类似的结构?

在这个例子中,明确定义整个数组并不是一个很大的问题。但是如果有很多元素,有很多重复,这可能变得非常繁琐(更不用说倾向于)。我希望我的代码大小保持相等,无论数组是五个3还是五百。

在JS中,我能想到的最短的是:

var a = [];
[[3,5],[8,4],[5,6]].forEach(function(x){while(x[1]--)a.push(x[0])});

在PHP中类似:

foreach(array(3=>5,8=>4,5=>6) as $d=>$n) while($n--) $a[]=$d;

显然,这并没有为可读性而获得奖励积分。有没有更好的方法(最好是一些语言结构)来做到这一点?

4 个答案:

答案 0 :(得分:1)

的JavaScript

  • 数组"添加" 通过Array.prototype.concat
  • 完成
  • 没有原生数组"乘法"

可读性和可重用性的最佳方法可能是为 Array"乘法" 定义函数,例如这个以指数方式进行

function arrMultiply(arr, i) {
    var arr_out = [];
    if (i & 1)
        arr_out = arr_out.concat(arr);
    while ((i >>>= 1) > 0) {
        arr = arr.concat(arr);
        if (i & 1)
            arr_out = arr_out.concat(arr);
    }
    return arr_out;
}

现在你可以 concat 一起"乘以"阵列

arrMultiply([3], 5).concat(arrMultiply([8], 4)).concat(arrMultiply([5], 6));
// [3, 3, 3, 3, 3, 8, 8, 8, 8, 5, 5, 5, 5, 5, 5]

如果您真的想要,可以扩展数组原型以包含arrMultiply 功能语法更接近你已经使用的,

Array.prototype.mul = function (i) {return arrMultiply(this, i);};

[3].mul(5).concat([8].mul(4)).concat([5].mul(6));
// [3, 3, 3, 3, 3, 8, 8, 8, 8, 5, 5, 5, 5, 5, 5]

答案 1 :(得分:1)

在JavaScript中:

Array.apply(null, Array(c)).map(function () {
    return v;
});



function f(c, v) {
    return Array.apply(null, Array(c)).map(function () {
        return v;
    });
}

document.write(f(5, 3).concat(f(4, 8)).concat(f(6, 5)));




"。适用()"允许以数组的形式将参数传递给函数,大致如下:

say.apply(null, ['hello', 'world'])

与:

相同
say('hello', 'world')

因此,Array(3)给出了[undefined x 3]

Array.apply(null, Array(3))

与:

相同
Array(undefined, undefined, undefined)

为什么需要它?请参阅JavaScript "new Array(n)" and "Array.prototype.map" weirdness

答案 2 :(得分:0)

您可以使用array_fill()将数值填入数组,并将array_merge()填入结果数组,例如

<?php

    $arr = [[3,5],[8,4],[5,6]];
    $result = [];
    foreach($arr as $v)
        $result = array_merge($result, array_fill(0, $v[1], $v[0]));

    print_r($result);

?>

输出:

Array
(
    [0] => 3
    [1] => 3
    [2] => 3
    [3] => 3
    [4] => 3
    [5] => 8
    [6] => 8
    [7] => 8
    [8] => 8
    [9] => 5
    [10] => 5
    [11] => 5
    [12] => 5
    [13] => 5
    [14] => 5
)

答案 3 :(得分:0)

怪异的(仅限数字)x - )

&#13;
&#13;
document.write(
  '<pre>' + JSON.stringify(
    makeArray('[1x1,3x4,42x3]')
  ) + '</pre>'
);

function makeArray (expr) {
  return JSON.parse(
    expr.replace(/(\d+)x(\d+)/g, function ($0, $1, $2) {
      return $1 + new Array(+$2).join(','+$1);
    })
  );
}
&#13;
&#13;
&#13;