动态创建这个简单数组的最有效方法是什么。
var arr = [ "1", "2", "3", "4", "5", "6", "7", "8", "9", "10"];
假设我们可以从变量中获取数字 10
var mynumber = 10;
动态创建这个简单数组的最有效方法是什么。
var arr = [ "1", "2", "3", "4", "5", "6", "7", "8", "9", "10"];
假设我们可以从变量中获取数字 10
var mynumber = 10;
var arr = [];
for(var i=1; i<=mynumber; i++) {
arr.push(i.toString());
}
更新:像这样的微优化是不值得的,这些天引擎非常聪明,我建议在 2020 年简单地使用
var arr = [];
.
这是我的做法:
var mynumber = 10;
var arr = new Array(mynumber);
for (var i = 0; i < mynumber; i++) {
arr[i] = (i + 1).toString();
}
我的回答对每个人来说都差不多,但请注意我做了一些不同的事情:
所以我创建了数组new Array(mynumber);
这个答案是关于“如何动态创建一个没有循环的数组”。
文字运算符[]
不允许我们动态创建,所以让我们看一下Array
,它是构造函数,它是方法。
在 ES2015 Array 中有 method .from()
,它可以很容易地让我们创建动态 Array:
Array.from({length: 10}) // -> [undefined, undefined, undefined, ... ]
当 Array 的构造函数接收数字作为第一个参数时,它会创建一个具有该数字大小的 Array,但它不可迭代,因此我们不能使用.map()
等.filter()
:
new Array(10) // -> [empty × 10]
但如果我们传递多个参数,我们将从所有参数接收数组:
new Array(1,2,3) // -> [1,2,3]
如果我们使用 ES2015,我们可以使用扩展运算符,它将空数组传播到另一个数组中,所以我们将得到可迭代的数组:
[...new Array(10)] // -> [undefined, undefined, undefined, ...]
但是如果我们不使用 ES2015 并且没有 polyfills,那么在 ES5 中还有一种方法可以创建没有循环的动态 Array。如果我们考虑.apply()
方法:它将第二个参数数组传播到参数。所以在 Array 的构造函数上调用 apply 就可以了:
Array.apply(null, new Array(10)) // -> [undefined, undefined, undefined, ...]
在我们有了动态可迭代数组之后,我们可以使用 map 来分配动态值:
Array.apply(null, new Array(10)).map(function(el, i) {return ++i + ""})
// ["1","2","3", ...]
听起来您只想构造一个包含整数值的字符串版本的数组。一个简单的方法:
var arr = [];
for (var i = 1; i <= mynumber; i++) arr.push(""+i);
对于更有趣的版本,你可以做一个生成器......
function tail(i, maxval) {
return [i].concat(i < maxval ? tail(i+1, maxval) : []);
}
var arr = tail(1, mynumber);
var arr = [];
while(mynumber--) {
arr[mynumber] = String(mynumber+1);
}
我会这样做;
var num = 10,
dynar = [...Array(num)].map((_,i) => ++i+"");
console.log(dynar);
误读问题,更正。尝试:
var myNumber = 100,
myarr = (function arr(i){return i ? arr(i-1).concat(i) : [i]}(myNumber));
只是为了好玩,如果你Array
像这样扩展:
Array.prototype.mapx = function(callback){
return String(this).split(',').map(callback);
}
你可以使用:
var myNum = 100,
myarr = new Array(myNum).mapx(function(el,i){return i+1;});
var arr = [];
for(var i=1; i<=mynumber; i++) {
arr.push("" + i);
}
根据JSPerf的说法,这在 Chrome 中似乎更快,但请注意,这完全依赖于浏览器。
您可以更改有关此代码段的 4 件事:
for
或while
。push
或直接访问。toString
.在每个浏览器中,总速度将取决于此列表中每个项目的每个选项在该特定浏览器中的执行情况。
TL;DR:尝试对这个特定部分进行微优化可能不是一个好主意。
我有一个类似的问题,我找到的解决方案(忘记了我在哪里找到的)是这样的:
Array.from(Array(mynumber), (val, index) => index + 1)
这个游戏有点晚了,但是现在你可以用 ES6 做一些很酷的事情。
您现在可以在一行代码中用随机数填充动态长度数组!
[...Array(10).keys()].map(() => Math.floor(Math.random() * 100))
如果您询问是否有内置的类似 Pythonicrange
的函数,则没有。你必须以蛮力的方式来做。也许你会感兴趣。
我希望你必须从数组变量中获取最后一个元素,所以我的解决方案
var arr = [ "1", "2", "3", "4", "5", "6", "7", "8", "9", "10"];
var mynumber = arr [arr .length - 1];
//var mynumber = 10;
我们中的一些人指的是性能不佳的使用:
function getArrayViaFrom(input) {
console.time('Execution Time');
let output = Array.from(Array(input), (value, i) => (i + 1).toString())
console.timeEnd('Execution Time');
return output;
}
function getArrayViaFor(input) {
console.time('Execution Time 1');
var output = [];
for (var i = 1; i <= input; i++) {
output.push(i.toString());
}
console.timeEnd('Execution Time 1');
return output;
}
console.log(getArrayViaFrom(10)) // Takes 10x more than for that is 0.220ms
console.log(getArrayViaFor(10)) // Takes 10x less than From that is 0.020ms
for (var j = 0; j <= data.legth -1; j++) {
lang += data.lang +", " ;
}
var langs = lang.split(',')
console.log("Languages =>", lang, typeof(lang), typeof(langs), langs)
console.log(lang[0]) // here access arrary by index value
你可以看到字符串和对象的类型
由于以前的答案都没有提供解决方案repeat
Here you go:
要生成包含十个数字的动态数组repeat
:
[...'x'.repeat(10).split('').keys()]
// [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
要得到你想要的:
var arr = [ "1", "2", "3", "4", "5", "6", "7", "8", "9", "10"];
只需向所有元素键添加一(因为数组是从零开始的)并通过字符串文字将数字转换为字符串,或者.toString()
甚至只是将空格添加到 number ''+x
。
let mynumber = 10;
const keys = [...'x'.repeat(mynumber).split('').keys()]
const arr = keys.map(x=>`${x+1}`);
//['1', '2', '3', '4', '5', '6', '7', '8', '9', '10']
与您要动态填充的所有数组的方式相同。一个 for 循环。Suedo 代码是
arr =array()
for(i; i<max; i++){
arr[]=i
}
那应该可以帮助您