假设我需要一个包含许多重复元素的数组,如下所示:
[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;
显然,这并没有为可读性而获得奖励积分。有没有更好的方法(最好是一些语言结构)来做到这一点?
答案 0 :(得分:1)
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 - )
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;