创建简单的动态数组
Create Simple Dynamic Array
动态创建这个简单数组的最有效方法是什么?
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());
}
> 使用 ES2015,可以使用 Array.from
方法在单个表达式中简洁地实现这一点,如下所示:
Array.from({ length: 10 }, (_, idx) => `${++idx}`)
要from
的第一个参数是一个类似数组的对象,它提供了一个长度属性。第二个参数是一个映射函数,它允许我们根据您的要求将默认的undefined
值替换为其调整后的索引值。在此处查看规范
更新:像这样的微优化是不值得的,这些天引擎非常聪明,以至于我建议在 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数组中具有方法.from()
,它可以轻松地允许我们创建动态数组:
Array.from({length: 10}) // -> [undefined, undefined, undefined, ... ]
当 Array 的构造函数收到 number 作为第一个参数时,它会创建一个大小为该数字的 Array,但它不是可迭代的,所以我们不能使用 .map()
、 .filter()
等:
new Array(10) // -> [empty × 10]
但是如果我们传递多个参数,我们将从所有参数接收数组:
new Array(1,2,3) // -> [1,2,3]
如果我们使用 ES2015,我们可以使用扩展运算符,它将空数组分散到另一个数组中,因此我们将得到可迭代数组:
[...new Array(10)] // -> [undefined, undefined, undefined, ...]
但是如果我们不使用 ES2015 并且没有 polyfill,也有一种方法可以在 ES5 中创建没有循环的动态数组。如果我们考虑.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);
这个游戏有点晚了,但是现在你可以用ES6做一些非常酷的事情。
您现在可以在一行代码中用随机数填充动态长度的数组!
[...Array(10).keys()].map(() => Math.floor(Math.random() * 100))
由于以前的答案都没有提供解决方案repeat
你去吧:
要使用 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()
将数字转换为字符串,甚至只是在数字''+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']
误读了问题,已更正。尝试:
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)
如果你问是否有一个内置的类似Pythonic range
的函数,没有。 你必须以蛮力的方式做到这一点。 也许你会对暴躁感兴趣。
我希望你必须从数组变量中获取最后一个元素,所以我的解决方案
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
更新 = 2020 年 6 月> 日
如果您使用的是 Node 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
您可以看到字符串和对象的类型
要动态填充的所有数组的方式相同。A for 循环。末户代码是
arr =array()
for(i; i<max; i++){
arr[]=i
}
这应该在路上对你有所帮助
- 如何向JSON数组动态添加属性
- Javascript数组动态
- 使用RequireJS从数组动态加载模块
- 在主要的JavaScript引擎中,在JavaScript关联数组(动态对象属性)中检索/插入的复杂性是多少
- 基于PHP数组动态附加表单
- jQuery:从带有 for 循环的数组动态构建表单
- JSon 数组动态列填充 AngularJs
- 使用 Javascript 创建变量数组(动态,下拉)
- 从数组动态构建表
- Ext 3.4-如何使用本地数组动态填充组合框
- jquery将数组动态地输入到slug
- 用字符串和字符串数组动态填充json对象
- 如何在Meteor中使用数组动态渲染多个模板
- 如何从json字段数组动态创建一个没有jquery的表单
- 用数组动态填充多维数组
- Jquery数组动态初始化
- 根据json创建的2d数组动态填充表
- Knockout:基于未知长度的数组动态创建可观察对象
- 使用数组动态注册事件
- jQuery多维数组(动态键)-不能设置属性undefined