9 数组的扩展

扩展运算符

  • 扩展运算符当作形参的时候,是可以将多个参数组合成一个数组传入,只能当作形参的最后一项
function fn(a,...nums){
   return nums.unshift(a)
}
  • 扩展运算符当作实参时,可以将一个数组拆解成多个参数的形式传入函数执行,可以放在任意位置
function add(a,b,c,d,e) {
  return a + b + c + d + e;
}
let x = [1, 2]
     y = [4, 5]
add(...x,3,...y) // 15
  • 通过push函数,将一个数组添加到另一个数组的尾部。
let arr1 = [0, 1, 2];
let arr2 = [3, 4, 5];
arr1.push(...arr2);

concat()方法是连接两个数组,返回一个新数组,不修改原来的数组

  • 利用扩展运算符复制数组
const a1 = [1, 2];
// 写法一
const a2 = [...a1];
// 写法二
const [...a2] = a1;
  • 扩展运算符还可以将字符串转为真正的数组。
[...'hello']
// [ "h", "e", "l", "l", "o" ]
  • 任何定义了遍历器(Iterator)接口的对象,都可以用扩展运算符转为真正的数组。
  • 扩展运算符内部调用的是数据结构的 Iterator 接口,因此只要具有 Iterator 接口的对象,都可以使用扩展运算符,比如 Map 结构。

Array.from()

Array.from方法用于将两类对象转为真正的数组:类似数组的对象(array-like object)和可遍历(iterable)的对象(包括 ES6 新增的数据结构 Set 和 Map)。

  • 扩展运算符背后调用的是遍历器接口(Symbol.iterator),如果一个对象没有部署这个接口,就无法转换。Array.from方法还支持类似数组的对象。所谓类似数组的对象,本质特征只有一点,即必须有length属性。因此,任何有length属性的对象,都可以通过Array.from方法转为数组,而此时扩展运算符就无法转换。
Array.from({ length: 3 });
// [ undefined, undefined, undefined ]

Array.of()

  • Array.of方法用于将一组值,转换为数组。
  • 这个方法的主要目的,是弥补数组构造函数Array()的不足。因为参数个数的不同,会导致Array()的行为有差异。
Array() // []
Array(3) // [, , ,]
Array(3, 11, 8) // [3, 11, 8]

Array.of(3, 11, 8) // [3,11,8]
Array.of(3) // [3]
Array.of(3).length // 1
  • Array.of总是返回参数值组成的数组。如果没有参数,就返回一个空数组。

数组实例的 copyWithin()

数组实例的copyWithin()方法,在当前数组内部,将指定位置的成员复制到其他位置(会覆盖原有成员),然后返回当前数组。也就是说,使用这个方法,会修改当前数组。
它接受三个参数。

  • target(必需):从该位置开始替换数据。如果为负值,表示倒数。
  • start(可选):从该位置开始读取数据,默认为 0。如果为负值,表示从末尾开始计算。
  • end(可选):到该位置前停止读取数据,默认等于数组长度。如果为负值,表示从末尾开始计算。

这三个参数都应该是数值,如果不是,会自动转为数值。

[1, 2, 3, 4, 5].copyWithin(0, 3)
// [4, 5, 3, 4, 5]

数组实例的 find() 和 findIndex()

  • 数组实例的find方法,用于找出第一个符合条件的数组成员。它的参数是一个回调函数,所有数组成员依次执行该回调函数,直到找出第一个返回值为true的成员,然后返回该成员。如果没有符合条件的成员,则返回undefined。
  • 数组实例的findIndex方法的用法与find方法非常类似,返回第一个符合条件的数组成员的位置,如果所有成员都不符合条件,则返回-1。
  • 这两个方法都可以接受第二个参数,用来绑定回调函数的this对象。
function f(v){
  return v > this.age;
}
let person = {name: 'John', age: 20};
[10, 12, 26, 15].find(f, person);    // 26

数组实例的 fill()

fill方法使用给定值,填充一个数组。
fill方法用于空数组的初始化非常方便。数组中已有的元素,会被全部抹去。
fill方法还可以接受第二个和第三个参数,用于指定填充的起始位置和结束位置。

['a', 'b', 'c'].fill(7)
// [7, 7, 7]

new Array(3).fill(7)
// [7, 7, 7]

['a', 'b', 'c'].fill(7, 1, 2)
// ['a', 7, 'c']
  • 如果填充的类型为对象,那么被赋值的是同一个内存地址的对象,而不是深拷贝对象。

数组实例的 entries(),keys() 和 values()

ES6 提供三个新的方法——entries(),keys()和values()——用于遍历数组。它们都返回一个遍历器对象,可以用for…of循环进行遍历,唯一的区别是keys()是对键名的遍历、values()是对键值的遍历,entries()是对键值对的遍历。

  • 如果不使用for…of循环,可以手动调用遍历器对象的next方法,进行遍历。

数组实例的 includes()

方法返回一个布尔值,表示某个数组是否包含给定的值,与字符串的includes方法类似。

Map 和 Set 数据结构有一个has方法,需要注意与includes区分。

  • Map 结构的has方法,是用来查找键名的,比如Map.prototype.has(key)、WeakMap.prototype.has(key)、Reflect.has(target, propertyKey)。
  • Set 结构的has方法,是用来查找值的,比如Set.prototype.has(value)、WeakSet.prototype.has(value)。

数组实例的 flat(),flatMap() 高维数组扁平化

数组的成员有时还是数组,Array.prototype.flat()用于将嵌套的数组“拉平”,变成一维的数组。该方法返回一个新数组,对原数据没有影响。

  • flat()默认只会“拉平”一层,如果想要“拉平”多层的嵌套数组,可以将flat()方法的参数写成一个整数,表示想要拉平的层数,默认为1。
[1, 2, [3, [4, 5]]].flat()
// [1, 2, 3, [4, 5]]

[1, 2, [3, [4, 5]]].flat(2)
// [1, 2, 3, 4, 5]

如果不管有多少层嵌套,都要转成一维数组,可以用Infinity关键字作为参数。
如果原数组有空位,flat()方法会跳过空位。

[1, [2, [3]]].flat(Infinity)
// [1, 2, 3]

[1, 2, , 4, 5].flat()
// [1, 2, 4, 5]
  • flatMap()方法对原数组的每个成员执行一个函数(相当于执行Array.prototype.map()),然后对返回值组成的数组执行flat()方法。该方法返回一个新数组,不改变原数组。

数组的空位

数组的空位指,数组的某一个位置没有任何值。
空位不是undefined,一个位置的值等于undefined,依然是有值的。空位是没有任何值,in运算符可以说明这一点。

0 in [undefined, undefined, undefined] // true
0 in [, , ,] // false

上面代码说明,第一个数组的 0 号位置是有值的,第二个数组的 0 号位置没有值。

空位的处理规则非常不统一,所以建议避免出现空位。

Array.prototype.sort() 的排序稳定性

常见的排序算法之中,插入排序、合并排序、冒泡排序等都是稳定的,堆排序、快速排序等是不稳定的。
现在 JavaScript 各个主要实现的默认排序算法都是稳定的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在matlab中,数组的大小可以通过扩展来改变。数组扩展指的是扩展数组的大小以便能够存储更多的数据。数组扩展可以通过两种方式进行操作:一种是增加数组的行或列;另一种是增加数组的维度。 在matlab中,使用“[]”操作符可以创建数组。可以使用该操作符在现有的数组中添加新的行或列;例如,a = [a,b]将b添加为a的新列;a = [a;b]将b添加为a的新行。 要添加新维度,需要使用cat和reshape函数。用cat函数合并多个数组来形成更大的数组。例如,a = cat(3,b,c)将b和c合并成一个新的三维数组。用reshape函数可以将已有数组的布局重构为不同形状,以增加数组的维度。例如,a = reshape(a,[m,n,p,q])将a数组重构为一个四维数组。 需要注意的是,扩展数组可能需要重新分配内存,这将消耗更多的资源。因此,尽量减少数组扩展操作及扩展的大小,这样可以提高程序的效率和速度。 ### 回答2: 在MATLAB中,数组扩展是指在一个现有的数组基础上添加一个或多个元素,从而创建一个新的、具有更大尺寸的数组。这是一个非常常见的操作,尤其是对于需要在更大尺寸的数据集上进行处理和计算的科学家、工程师和分析师来说。 MATLAB提供了多种方法来扩展数组,包括: 1. 使用括号扩展语法: 通过在现有数组的末尾添加一个或多个元素,并将其包含在方括号中,可以扩展数组。例如,要将一个长度为3的向量 `[1,2,3]` 扩展到长度为4,可以使用以下语法: ` A = [1,2,3,4]` 2. 使用内置函数来创建新数组: MATLAB中内置的 `zeros`、`ones`、`eye`、`rand` 和 `randn` 函数可以用于创建初始值为0、1、单位矩阵、随机值和正态分布随机值的新数组。然后,可以使用括号扩展语法将新数组连接在一起以扩展现有数组。例如,要将一个长度为2的向量 `[1,2]` 扩展到长度为5,可以使用以下语法: `A = [1,2,zeros(1,3)]` 3. 使用内置函数 cat 或 horzcat/vetcath来连接数组: 可以使用内置的 `cat` 函数将不同的数组沿着不同的维度连接在一起,从而创建扩展数组。例如,要将两个2 x 2的矩阵水平连接起来以创建一个2 x 4的矩阵,可以使用以下语法: `A = cat(2, [1,1;2,2], [3,3;4,4])` 总之,在MATLAB中,通过使用括号扩展语法、内置的函数和工具箱中的其他函数,可以轻松地扩展数组。这可以节省编写代码的时间,同时使代码更加简洁和易于阅读。 ### 回答3: MATLAB是一款流行的数学软件,它提供了各种函数和工具箱,用于分析、处理和可视化数据。在MATLAB中,数组是数据的基本对象。当我们需要增加或减少数组的大小时,我们可以使用数组扩展来实现。 数组扩展是指在已有的数组中增加一些元素或者减少一些元素。在MATLAB中,我们可以使用点号和方括号来进行数组扩展。点号用于在末尾添加元素,方括号用于在任意位置添加或删除元素。 点号数组扩展可以使用以下语法: ```matlab A(end+1) = x ``` 其中,`A`是一个数组,`end`表示数组的最后一个元素,`x`是要添加的新元素。此语句将会在`A`的末尾添加一个新元素`x`。 除了`end`,我们还可以使用数字来指定添加位置: ```matlab A(n+1) = x ``` 这将会在`A`的第`n`个元素的后面添加新元素`x`。 方括号数组扩展可以使用以下语法: ```matlab A = [A(1:n-1), x, A(n:end)] ``` 其中,`A`是一个数组,`n`是要添加或删除的位置,`x`是要添加的新元素或删除的元素。 如果我们要在`A`的第`n`个位置添加新元素`x`,则我们可以使用以上语句将`A`分成两个部分: - 第一个部分是从`A`的第一个元素到第`n-1`个元素; - 第二个部分是从`A`的第`n`个元素到末尾。 然后,我们可以将新元素`x`插入到两个部分之间,从而扩展数组。 类似地,如果我们要删除`A`中的第`n`个元素,则可以使用如下代码: ```matlab A = [A(1:n-1), A(n+1:end)] ``` 这将会将`A`分成两个部分: - 第一个部分是从`A`的第一个元素到第`n-1`个元素; - 第二个部分是从`A`的第`n+1`个元素到末尾。 然后,我们可以将这两个部分合并成一个新的数组,从而缩小了`A`的大小。 总之,数组扩展是MATLAB中非常实用的功能,可以帮助我们快速增加或减少数组的大小,从而进行更高效的数据分析和处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值