ES2015 (ES6) 新增的方法
const arr = [1, 2, 3, 4 ,5];
const it = arr.entries();
console.log(it);
// Array Iterator {} -> next() -> { value: [index, item], done: ? }
返回数组的迭代器对象,其迭代对象的value
用数组以[index, item]
的结构展现。
var o = {
a: 1,
b: 2,
c: 3
}
for (let k in o){
console.log(k, o[k]);
}
//--------------------------
const arr = [1, 2, 3, 4 ,5];
for (let v of arr){
console.log(v); // 无法显示出其下标
}
const it = arr.entries();
for (let c of it){
const [i, v] = c;
console.log(i, v); // [index, item]
}
数组实际上就是一个特殊的对象, key键名是一个从0开始有序递增的数字,按顺序对应上数组的每一个元素。所以才有类数组(对象模拟一个数组)
var o = {
0: 1,
1: 2,
2: 3,
length: 3
}
for (let v of 0){
console.log(v); // 报错 o is not iterable
}
为对象增加一个Symbol.iterator
var o = {
0: 1,
1: 2,
2: 3,
length: 3,
[Symbol.iterator]: Array.prototype[Symbol.iterator]
}
for (let v of 0){
console.log(v);
}
// 1
// 2
// 3
//-------------
// 或者
Object.prototype[Symbol.iterator] = Array.prototype[Symbol.iterator];
// 也可以
Array.from(0);
总结出 for … of 遍历可迭代对象(实现了 Symbol.iterator
)
对于迭代器每次都要使用next的真正使用方式,通过next把其结果放入到一个数组中去
const arr = [1, 2, 3, 4 ,5],
newArr = [],
it = arr.entries();
for (var i = 0; i < arr.length + 1; i++) {
var item = it.next();
!item.done && (newArr[i] = item.value);
}
利用entries对多维数组排序
const newArr= [
[56, 23],
[56, 34, 100, 1],
[123, 234, 12]
]
function sortArr (arr) {
var _it = arr.entries(),
_doNext = true; // 是否进入下一次循环
while(_doNext){
var _r = _it.next();
if(!_r.done) {
_r.value[1].sort((a, b) => a - b); // 由小到大排序
_doNext = true;
} else {
_doNext = false;
}
}
return arr;
}
console.log(sortArr(newArr));