【问题标题】:How to create a prefilled array of defined length? [duplicate]如何创建定义长度的预填充数组? [复制]
【发布时间】:2019-09-29 07:48:38
【问题描述】:

我正在尝试创建一个具有定义长度的数组并用空数组填充它。我已经尝试使用@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

【问题讨论】:

标签: javascript arrays ecmascript-6


【解决方案1】:

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

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

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

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

const tasks =
  fillEmptyArrays(3)

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

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

【讨论】:

  • 酷,我真的很喜欢。你能解释一下_是怎么理解的吗?
  • Dandy,在这种情况下,_ 是一个约定,表示函数的参数未在函数体中使用,因此不需要名称;该函数总是返回[]。你可以用任何有效的变量名替换_,程序仍然可以工作。有关详细信息,请参阅Array.from 的第二个参数。
  • 不要在变量名中包含像 Array 这样的类型名称......从长远来看,这种想法会伤害你 - 是什么让你这么想?
  • @bob JavaScript 绑定可以有任何类型的值,在let 的情况下,类型可能会随着时间而改变。多态函数...动态函数调用...没有什么强制要求someArray 是一个数组,在动态情况下,当它不是一个数组时,您的大脑很难在名称中看到“数组”,然后在精神上把它当作别的东西。
【解决方案2】:

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

所以tasksArray 对同一个数组有三个引用,而tasksArray2 对三个不同数组中的每一个都有一个引用。

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

你可以用计数器来接近它:

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

【讨论】:

  • 谢谢,现在我明白这是由于fill()。但是,Array.from() 解决方案看起来更干净。
【解决方案3】:

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

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

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);

【讨论】:

  • 只使用Array(3) - { length: 3 } 是一种巫术,直接使用这种行为会使程序员的头脑处于不太有效的水平。
  • @user633183,我喜欢巫毒教。
  • @user633183 我不同意。传递一个超级基本的类数组应该不比使用一元 +!! 或其他小技巧更巫术。我相当有信心,在这一点上,如果还没有达到这一点,那么成为这样的成语正在获得牵引力。
  • 是的,但作为专业开发人员,我们也欣赏简单、可维护且易于理解的代码。
  • VLAZ,我强烈反对+!!"Tricks are for kids!"。真实的程序表现出明确的意图。使用Number.parseIntBoolean,即使是多击几次键。
猜你喜欢
  • 2013-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-12
  • 2021-11-08
  • 2015-12-03
  • 1970-01-01
相关资源
最近更新 更多