如何创建定义长度的预填充数组?

时间:2019-05-11 20:10:16

标签: javascript arrays ecmascript-6

我正在尝试创建一个具有定义长度的数组,并用空数组填充它。我尝试使用@stpoa的答案here给出的所有可能性,但我的数组无法正常运行。

给出代码(为方便起见,我将其简化了):

const tasksArray = Array(3).fill([])
const tasksArray2 = [[], [], []]
const tasks = ['task1', 'task2']

const fillWithData = (array) => {
  tasks.forEach(task => {
    array[0].push(task)
  })
}

给我tasksArray的错误输出,显然给tasksArray2的正确输出(硬编码)

fillWithData(tasksArray) // [['task1', 'task2'], ['task1', 'task2'], ['task1', 'task2']] => not OK, duplicates values!
fillWithData(tasksArray2) // [['task1', 'task2'], [], []] => that's OK

3 个答案:

答案 0 :(得分:5)

您需要在数组内部获取独立的对象引用,而不是从字面上获得常量值。

通过将Array.from与具有length属性的对象和内置映射功能一起使用,您可以获得独立数组的数组。

const tasksArray = Array.from({ length: 3 }, _ => [])
const tasks = ['task1', 'task2']

const fillWithData = (array) => {
  tasks.forEach(task => {
    array[0].push(task)
  })
};

fillWithData(tasksArray);
console.log(tasksArray);

答案 1 :(得分:4)

taskArray中,您使用的[]被作为引用传递,taskArray中的元素都引用相同的数组。

taskArray2中,您有三个单独的空数组[],每个数组都有自己的引用。因此,您不会得到重复的值。

如果您希望以编程方式创建一个空数组,请使用Array.from-

const fillEmptyArrays = (count) =>
  Array.from(Array(count), _ => [])

const tasks =
  fillEmptyArrays(3)

console.log(tasks)
// [ [], [], [] ]

也请不要在变量名Array中包含类似tasksArray的类型名;只需将其命名为tasks。 JavaScript是一种动态类型的语言,从长远来看,这种思维会伤害您。

答案 2 :(得分:2)

fill将您传递的值放在数组的每个索引处。

因此tasksArray对同一数组有三个引用,而tasksArray2对三个不同数组中的每个引用。

如果要在其中放置三个不同的数组,则需要显式创建三个数组。

您可以与柜台联系:

const tasksArray2 = [];
let count = 3;
while (count--) {
    tasksArray2.push([]);
}