我正在尝试创建一个具有定义长度的数组,并用空数组填充它。我尝试使用@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
答案 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([]);
}