41

动态创建这个简单数组的最有效方法是什么。

var arr = [ "1", "2", "3", "4", "5", "6", "7", "8", "9", "10"];

假设我们可以从变量中获取数字 10

var mynumber = 10;
4

17 回答 17

83
var arr = [];
for(var i=1; i<=mynumber; i++) {
   arr.push(i.toString());
}
于 2012-05-04T15:38:10.273 回答
19

使用ES2015,这可以使用如下方法在单个表达式中简洁地实现Array.from

Array.from({ length: 10 }, (_, idx) => `${++idx}`)

的第一个参数from是一个类似数组的对象,它提供了一个长度属性。第二个参数是一个 map 函数,它允许我们undefined根据您的要求将默认值替换为调整后的索引值。在此处查看规范

于 2016-09-25T17:29:26.713 回答
15

更新:像这样的微优化是不值得的,这些天引擎非常聪明,我建议在 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);

于 2012-05-04T17:57:52.467 回答
7

这个答案是关于“如何动态创建一个没有循环的数组”。

文字运算符[]不允许我们动态创建,所以让我们看一下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", ...]
于 2017-10-31T17:23:28.733 回答
4

听起来您只想构造一个包含整数值的字符串版本的数组。一个简单的方法:

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);
于 2012-05-04T15:38:03.290 回答
2
var arr = [];
while(mynumber--) {
    arr[mynumber] = String(mynumber+1);
}
于 2012-05-04T15:38:35.037 回答
2

我会这样做;

var num = 10,
  dynar = [...Array(num)].map((_,i) => ++i+"");
console.log(dynar);

于 2016-10-12T14:38:49.950 回答
1

误读问题,更正。尝试:

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;});
于 2012-05-04T15:39:43.543 回答
1
var arr = [];
for(var i=1; i<=mynumber; i++) {
   arr.push("" + i);
}

根据JSPerf的说法,这在 Chrome 中似乎更快,但请注意,这完全依赖于浏览器。

您可以更改有关此代码段的 4 件事:

  1. 使用forwhile
  2. 使用前向或后向循环(在开始时向后创建稀疏数组)
  3. 通过索引使用push或直接访问。
  4. 使用隐式字符串化或显式调用toString.

在每个浏览器中,总速度将取决于此列表中每个项目的每个选项在该特定浏览器中的执行情况。

TL;DR:尝试对这个特定部分进行微优化可能不是一个好主意。

于 2012-05-04T17:33:33.730 回答
1

我有一个类似的问题,我找到的解决方案(忘记了我在哪里找到的)是这样的:

Array.from(Array(mynumber), (val, index) => index + 1)

于 2018-03-28T17:17:56.353 回答
1

这个游戏有点晚了,但是现在你可以用 ES6 做一些很酷的事情。

您现在可以在一行代码中用随机数填充动态长度数组!

[...Array(10).keys()].map(() => Math.floor(Math.random() * 100))
于 2020-07-26T13:53:43.883 回答
0

如果您询问是否有内置的类似 Pythonicrange的函数,则没有。你必须以蛮力的方式来做。也许会感兴趣。

于 2012-05-04T15:39:38.310 回答
0

我希望你必须从数组变量中获取最后一个元素,所以我的解决方案

var arr = [ "1", "2", "3", "4", "5", "6", "7", "8", "9", "10"];
var mynumber = arr [arr .length - 1];
//var mynumber = 10;
于 2019-01-27T18:04:06.237 回答
0

我们中的一些人指的性能不佳的使用:

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

于 2020-05-25T07:01:48.103 回答
0

更新 = > 2020 年 6 月

如果您使用的是节点 js,您可以使用“,”运算符创建或附加一个字符串值,然后在循环内您可以

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
            

你可以看到字符串和对象的类型

于 2020-06-03T05:54:40.200 回答
0

由于以前的答案都没有提供解决方案repeatHere 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']
于 2021-10-24T20:58:12.150 回答
-3

与您要动态填充的所有数组的方式相同。一个 for 循环。Suedo 代码是

arr =array()
for(i; i<max; i++){
 arr[]=i

}

那应该可以帮助您

于 2012-05-04T15:44:18.330 回答