如何在新的Array()中同时初始化数组的长度和值?

时间:2019-01-03 18:11:00

标签: javascript arrays

让我们考虑一下,我必须使用一些值初始化一个数组 所以我可以通过编写以下代码来实现。

var arr = new Array("a", "b", "c", "d")
console.log(arr)

同样,在使用数组之前,我必须确定数组的长度。 所以我可以通过以下代码来实现。

var arr = new Array(5)
console.log(arr.length)

最后,我有以下问题吗?

  • 是否可以使用new Array()同时初始化具有数组长度和不同值(不是相似值)的数组?
  • 如何使用new Array()初始化单个整数值?

编辑: 在这里,不同的值表示存在一些特定的字符串值。

我知道使用数组文字时很简单。但这不是我想要的。

6 个答案:

答案 0 :(得分:0)

您可以使用.fill()

console.log(new Array(5).fill(2));
// [2, 2, 2, 2, 2]

  

是否可以使用new Array()同时使用数组长度和值初始化数组?

据我所知,这还不可能。

  

如何使用new Array()初始化单个整数值?

那将是k => new Array(1).fill(k)。但是,如果必须选择,我将使用k => [k]。请注意,建议不要在其他情况下使用new Array()来初始化它的长度。但是即使那样,您也应该确保给它提供一个整数,因为new Array(n)的行为有点不固定,并且在您希望这样做时不会抛出错误。

实际上,我希望无法使用new Array()用值初始化数组。最糟糕的是使用new Array(...args),当args[5]时,其行为会发生巨大变化。如果要使用值初始化数组,则应坚持使用[]数组。

  • Array("")给出[""]
  • 类似地,Array([])给出[[]]Array({})[{}]
  • Array(5)给出了一个具有5个空插槽的数组
  • Array(2.5)产生一个Uncaught RangeError: Invalid array length
  • 此外,Array()给出了[]

注意:这是Chromium的行为。我没有检查Firefox。

答案 1 :(得分:0)

两个问题的答案均​​为否。看the docsArray函数有两个重载。

  

使用给定的元素初始化JavaScript数组,除非将单个参数传递给Array构造函数且该参数为数字(请参见下面的arrayLength参数)。

     

如果传递给Array构造函数的唯一参数是0到232-1(含)之间的整数,则会返回一个新的JavaScript数组,其length属性设置为该数字。

只有这两种可能性,指定数组的大小和值没有重载。

答案 2 :(得分:0)

您可以像这样创建和填充数组:

let a = Array(100).fill(null)

console.log(a)

或者增加您的填充值:

let i=0,a = Array(100).fill(0).flatMap(x=>[x+i++])

console.log(a)

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/flatMap

答案 3 :(得分:0)

创建数组的方法很少:

1)文字

const a = [1,2,3];
console.log(a);

但是您说您不想使用它。

2)数组构造函数:

const a = new Array(10); //array of length 10
console.log(a); 

const b = new Array(1,2,3);
console.log(b); // array with elements 1,2,3

但是你说你不想这么做

3)Array.from

const a = Array.from(new Array(10), (val, ind) => ind); // array of 10 values and map applied to these elements
console.log(a);

在这三种方式中,您拥有Array.fill方法,该方法只能用静态值调用:

const a = new Array(10);
console.log(a.fill(5)); // array of 10 number elements with value of 5

考虑到您的情况,也许您的解决方案可能是使用Array.from,并使用您可以提供的map函数作为第二个参数。 您可能会想创建如下功能:

function createMyArray(length, start, end) {
  return Array.from(new Array(length), (val, ind) => ind >= start && ind <= end ? ind : undefined);
}

console.log(createMyArray(5, 2, 4));
console.log(createMyArray(5, 1, 3));
console.log(createMyArray(10, 2, 6));

您应该问自己的问题是:我要使用的数据来自何处以及来自何处?否则,这真的太含糊了

答案 4 :(得分:0)

  

是否可以使用new Array()同时初始化具有数组长度和不同值(不是相似值)的数组?

不,您不能仅使用Array constructor来做到这一点。

另一种方法是这样:

var a = ['a', 'b', 'c', 'd'];
a.length = 10;
console.log(a);

  

如何使用new Array()初始化单个整数值?

You can't。当您尝试按照规范进行操作时会发生以下情况:

  

Array(len)

     

[...]

     
      
  • 让intLen成为ToUint32(len)。
  •   
  • 如果intLen≠len,则引发RangeError异常。
  •   
  • 让setStatus被设置(数组,“ length”,intLen,true)。
  •   
  • 声明:setStatus不是突然完成。   返回数组。
  •   

改用其他方式创建数组(例如[1]Array.of(1))。

答案 5 :(得分:0)

这是在不使用数组文字的情况下初始化数组的另一种方法,但与此相关。

let arr = [...Array(10)].map((emptyItem, index) => index);
// [0,1,2,3,4,5,6,7,8,9]

我找不到与该表达式的构造方式匹配的文档,因此无法完全解释它。但是它正在使用传播语法将10个空项目传播到一个数组中。