类数组,Array.from
类数组
类数组是与数组格式相似,不具备数组方法且必须有length属性的为类型,(特殊的对象,继承与Object)不是JS内置的类型。注:下标和数组一样必须从0开始,否则在转化为数组,类数组length为1时,会返回一个包含空数据的一个数组
补充
Array.from.length // 1
// 对于方法的length,length指的是方法形参的个数,Array.from的第一个参数是必填的,剩余参数是通过arguments来获取的。
// 如果类数组不是和数组一样以下标形式为key,将转化成元素全为undefined的数组
const obj = {
a: 1,
b: 2,
length: 2
}
Array.from(obj); // [undefined, undefined]
// 类数组
const obj = {
0: 1,
1: 2,
2: 3,
length: 3
}
// 下标不从0,开始 length 为1
const obj = {
1: 1
length: 1
}
// Array.prototype.slice.call(obj) 类数组必须具有length
Array.prototype.slice.call(obj); // [empty]
// 下标不从0,开始 length 为 2
const obj = {
1: 1
length: 2
}
Array.prototype.slice.call(obj); // [empty, 1]
Array.from
可以使用 Arrary.from 将类数组和可迭代的数据转化为数组。
const obj = {
0: 1,
1: 2,
2: 3,
length: 3
}
Array.from(obj); // [1,2,3]
Array.from 或根据 length 的值截裁或补充,补充的是 undefined。
// length = 0
const obj = {
0: 1,
1: 2,
2: 3,
length: 0
}
Array.from(obj); // []
// 没有 length
const obj = {
0: 1,
1: 2,
2: 3
}
Array.from(obj); // []
// length 值小于类数组实际值数量
const obj = {
0: 1,
1: 2,
2: 3,
length: 2
}
Array.from(obj); // [1, 2]
// length 值大于类数组实际值数量
const obj = {
0: 1,
1: 2,
2: 3,
length: 4
}
Array.from(obj); // [1, 2, 3, undefined]
如果类数组中实现数组的push
// 没有 length
const obj = {
0: 1,
1: 2,
2: 3,
push: [].push
}
obj.push(3);
// 结果
const obj = {
0: 3,
1: 2,
2: 3,
length: 1
push: [].push
}
之所以会这样,是因为数组中push方法是数组的length有关,每次push都会累加length,但对于没有length属性的数据来说,默认当数据的length为0,修改下标为0的属性值,并累加length,转化为类数组。
// 有length属性
const obj = {
0: 1,
1: 2,
2: 3,
length: 3
push: [].push
}
obj.push(3);
// 结果
const obj = {
0: 3,
1: 2,
2: 3,
3: 3
length: 4
push: [].push
}
如果是类数组,会根据当前的length值,修改相应下标为(length - 1)的属性值,并累加length。
题:将
const obj = {
0: 1,
1: 2,
length: 2
}
转化为
const objArr = [
{
id: 0,
classes: 1
},
{
id: 1,
classes: 1
}
]
// 一般实现方法
const arr = Array.from(obj);
const objArr = arr.map((item, index) => {
return {
id: index,
classes: item
}
});
// 但是 Array.from 有三个参数:类数组,回调函数,this
const objArr = Array.from(obj, (item, index) => {
return {
id: index,
classes: item
}
});