是否有一种在JavaScript ES6中初始化数组的功能方法?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了是否有一种在JavaScript ES6中初始化数组的功能方法?相关的知识,希望对你有一定的参考价值。

我终于放弃并写了一个for循环来初始化一个简单的对象数组,其中每个对象都有一个递增的计数器(id)作为对象的属性。换句话说,我只想要:

var sampleData = [{id: 1},{id: 2},...];

我希望有一个紧凑的语法,我可以把它放在我的返回语句上。

let sampleData = [];
for (var p = 0; p < 25; p++){
    sampleData.push({id: p});
}

return {
    data: sampleData,
    isLoading: true
};
答案

Array.from()是一个很好的方式来做到这一点。您可以传递{length: somlength}对象或其他类似数组的对象以及定义每个项目的函数。第一个参数(称为_只是为了表明它没有被使用)到该函数将是我们传入的数组中的项(但我们只传入一个长度所以它并不意味着太多),第二个i是索引,用于你的id

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

console.log(sampleData)
另一答案

我通常做的是:

const data = Array(10).fill().map((v, i) => ({id: i + 1}))

fill确保它可以与map一起使用

另一答案

您可以将spread运算符与Array一起使用,然后将每个undefined元素映射到您想要的对象。

var arr = [...Array(10)].map((_,i)=>({id:i}));
console.log(arr)
另一答案

你正在寻找一个变形,或反向折叠 -

// unfold : ( (r, state) -> List r, () -> List r, state ) -> List r
const unfold = (f, init) =>
  f ( (x, next) => [ x, ...unfold (f, next) ]
    , () => [] 
    , init
    )
    
// sampleData : List { id: Int }
const sampleData =
  unfold
    ( (next, done, i) =>
        i > 25
          ? done ()
          : next ({ id: i }, i + 1)
    , 0
    )
    
console.log (sampleData)
// [ { id: 0 }, { id : 1 }, ... { id: 25 } ]
另一答案

.from()的例子很棒但是如果你真的想要有创意,请查看这个。

const newArray = length => [...`${Math.pow(10, length) - 1}`]
newArray(2)
newArray(10)

但是受到严重限制

newArray(1000)
["I", "n", "f", "i", "n", "i", "t", "y"]
另一答案

您可以使用简单的递归过程来执行此操作。

const iter = (arr, counter) => {
  if (counter === 25) return arr;
  return iter([...arr, {id:counter}], counter + 1)
}
iter([], 0)

以上是关于是否有一种在JavaScript ES6中初始化数组的功能方法?的主要内容,如果未能解决你的问题,请参考以下文章

在 Javascript/Node 中运行函数数组的规范方法

Javascript 方法从 1970-01-01 中查找毫秒数? [复制]

这是一种在 javascript 中实例化类的方法吗? [复制]

是否有一种全局方法来捕获 javascript 中的网络错误

是否有一种标准方法可以将“复制和粘贴”Javascript 代码添加到 Django 项目中?

ES6-数字操作,判断是否是整数,判断最大值最小值