模板文字可初始化给定长度的数组

时间:2018-07-26 07:58:28

标签: javascript template-literals

我碰到了this question(如何初始化[{id: 1},{id: 2},...]之类的数组)。

可接受的答案是:

let sampleData = Array.from({length: 10}, (_, i) => ({id:i}))

console.log(sampleData)

还有很多其他的
但是,我认为template literals是一种解决方案,但我不知道如何使它工作。

到目前为止,我有:

var i = 0;
var arr = `[${"{id:++i},".repeat(10)}]`
console.log("As a string",arr);
console.log("Evaluated",eval(arr));

但是,它使用eval,我知道这是错误的。

我也尝试过

var i = 0;
var arr = `[${"{id:${++i}},".repeat(10)}]`
console.log(arr);

但是我还没有以某种方式调用此字符串的反勾号(类似TemplateLiteralFunction.call上的arr)来解析这些表达式。
而且,除了编写标记函数外,我还只是编写一个名为initArray(ofLength)的函数。

因此,无论如何,您是否可以使用不带eval或标记函数的模板文字来实现给定长度的数组填充值?也许以某种方式嵌套模板文字?

1 个答案:

答案 0 :(得分:3)

您可以使用Function constructor

  

Function构造函数创建一个新的Function对象。呼叫   构造函数可以直接创建函数,但会受到影响   来自安全性和类似(但重要性不高)的性能   与eval类似的问题。但是,与eval不同,Function构造函数   允许在全局范围内执行代码,从而更好地提示   编程习惯,并允许更高效的代码最小化。

var template = `[${"{\"id\":${++i}},".repeat(10)}]`
template = template.replace(/,]$/,']'); //replace last comma

var parser = new Function("{i}", "return `" + template + "`;");
var arr = parser({i:0});
console.log(JSON.parse(arr));