创建一个具有相同元素重复多次的数组
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了创建一个具有相同元素重复多次的数组相关的知识,希望对你有一定的参考价值。
在Python中,[2]
是一个列表,下面的代码给出了这个输出:
[2] * 5 # Outputs: [2,2,2,2,2]
使用javascript中的数组是否存在一种简单的方法?
我编写了以下函数来做到这一点,但有更短或更好的东西吗?
var repeatelem = function(elem, n){
// returns an array with element elem repeated n times.
var arr = [];
for (var i = 0; i <= n; i++) {
arr = arr.concat(elem);
};
return arr;
};
如果您需要多次重复数组:
var arrayA = ['a','b','c'];
var repeats = 3;
var arrayB = Array.apply(null, {length: repeats * arrayA.length})
.map(function(e,i){return arrayA[i % arrayA.length]});
// result: arrayB = ['a','b','c','a','b','c','a','b','c']
灵感来自this answer
另一个单线:
Array.prototype.map.call([]+Array(5+1),function(){ return '2'; })
此函数创建一个(长度)元素数组,其中每个元素等于(值),只要(value)是整数或整数字符串。任何十进制数都将被截断。如果你想要十进制数,请将“parseInt(”替换为“parseFloat(”)
function fillArray(length, intValue) {
var vals = (new Array(length + 1)).join(intValue + '|').split('|').slice(0,length);
for(var i = 0; i < length; i += 1) {
vals[i] = parseInt(vals[i]);
}
return vals;
}
例子:
fillArray(5, 7) // returns [7,7,7,7,7]
fillArray(5, 7.5) // returns [7,7,7,7,7]
fillArray(5, 200) // returns [200,200,200,200,200]
当我使用像这样的数组时,我遇到了上述方法的问题
var array = ['foo', 'bar', 'foobar'];
var filled = array.fill(7);
//filled should be ['foo', 'bar', 'foobar', 'foo', 'bar', 'foobar', 'foo']
为了得到这个,我正在使用:
Array.prototype.fill = function(val){
var l = this.length;
if(l < val){
for(var i = val-1-l; i >= 0; i--){
this[i+l] = this[i % l];
}
}
return this;
};
我今天在试图制作2D阵列而不使用循环时发现了这一点。回想起来,加入一个新的阵列很整洁;我尝试映射一个新的数组,这不起作用,因为地图跳过空插槽。
"#".repeat(5).split('').map(x => 0)
“#”char可以是任何有效的单个字符。 5将是您想要的元素数量的变量。 7将是您想要填充数组的值。
新的填充方法更好,当我编码时我不知道它存在,也不知道重复是es6;我打算写一篇关于使用这个技巧与减少做酷事的博客文章。
http://jburger.us.to/2016/07/14/functionally-create-a-2d-array/
var finalAry = [..."2".repeat(5).split("")].map(Number);
console.log(finalAry);
如果你正在使用像lodash / underscore这样的实用带,你可以这样做:)
let result = _.map(_.times(foo), function() {return bar})
也可以用作单线:
function repeat(arr, len) {
while (arr.length < len) arr = arr.concat(arr.slice(0, len-arr.length));
return arr;
}
改进Vivek's answer,这适用于任何长度的字符串,以填充长度为n的数组:Array(n+1).join('[string to be repeated][separator]').split('[separator]').slice(0, n)
试试这个:
"avinash ".repeat(5).trim().split(" ");
我需要一种方法来重复/循环一个数组(有n个项目)m次。
例如,将(人员)列表分发到一周/一个月。假设我有3个名字,我希望他们在一周内重复:
fillArray(["Adam", "Blair", "Curtis"], 7); // returns ["Adam", "Blair", "Curtis", "Adam", "Blair", "Curtis", "Adam"]
function fillArray(pattern, count) {
let result = [];
if (["number", "string"].includes(typeof pattern)) {
result = new Array(5);
result.fill(pattern);
}
else if (pattern instanceof Array) {
for (let i = 0; i < count; i++) {
result = result.concat(pattern);
}
result = result.slice(0, count);
}
return result;
}
fillArray("a", 5); // ["a", "a", "a", "a", "a"]
fillArray(1, 5); // [1, 1, 1, 1, 1]
fillArray(["a", "b"], 5); // ["a", "b", "a", "b", "a"]
在lodash,它并没有那么糟糕:
_.flatten(_.times(5, function () { return [2]; }));
// [2, 2, 2, 2, 2]
编辑:更好:
_.times(5, _.constant(2));
// [2, 2, 2, 2, 2]
编辑:更好:
_.fill(Array(5), 2);
[c] * n
可以写成:
Array(n+1).join(1).split('').map(function(){return c;})
所以对于[2] * 5
Array(6).join(1).split('').map(function(){return 2;})
你也可以像这样扩展Array的功能:
Array.prototype.fill = function(val){
for (var i = 0; i < this.length; i++){
this[i] = val;
}
return this;
};
// used like:
var arry = new Array(5).fill(2);
// or
var arry = new Array(5);
arry.fill(2);
console.log(arry); //[2, 2, 2, 2, 2]
我应该注意,如果您使用第三方库,扩展内置对象的功能可能会导致问题。始终将这一点权衡到你的决定中
没有更简单的方法您需要创建一个循环并将元素推入数组。
以上是关于创建一个具有相同元素重复多次的数组的主要内容,如果未能解决你的问题,请参考以下文章