使用 tsp 工具,基于 TypeScript 的代码,记录 ECMAScript 不同版本中的 Array 属性和方法,以及其使用。
使用 tsp 生成项目:
tsp g arrayMs arrayMsClass ES中的数组测试
项目生成后,使用 Gulp 打包并 watch 这个项目:
tsp w arrayMs
另开一个 CLI,执行:
tsp s arrayMs 6666
让这个 tsp 项目运行在 6666 端口。
文件 /src/main.ts :
let arr1 = [3,2,6,4,1,5]; let arr2 = [3,4,5,6,7,8]; let str1:string = 'abcde'; console.log('arr1\n',arr1); console.log('arr2\n',arr2); /*=============ES3以及更早版本 ================*/ /* Array.length Array.prototype */ console.log('字符串 str1:\n', str1); let arr3 = str1.split(''); /* ["a", "b", "c", "d", "e"] */ console.log('字符串 str1 转换为数组 arr3:\n', arr3); let arr4 = arr1.reverse(); /* [5, 1, 4, 6, 2, 3] */ console.log('arr1 颠倒后的 arr4:\n', arr4); /* arr5 等于排序后的 arr1; */ let arr5 = arr1.sort((x,y)=>{ return y-x; }); console.log('arr1 排序后:\n', arr1); let arr6: Array<any> = [[11,22],[33,44]]; let arr7: Array<any> = arr1.concat(arr2, arr6 ); /* [6, 5, 4, 3, 2, 1, 3, 4, 5, 6, 7, 8, [11,22],[33,44]] */ console.log('arr1,arr2,arr6合并后:\n', arr7); /* 不带参数,就发复制了 arr7 的值; 带一个参数, */ let arr8 = arr7.slice(2); /* [4, 3, 2, 1, 3, 4, 5, 6, 7, 8, Array[2], Array[2]] */ console.log(arr8); let arr9 = arr7.slice(3,-2); /* [3, 2, 1, 3, 4, 5, 6, 7, 8] */ console.log('arr9 \n',arr9); let arr10 = arr9.splice(4,1); /* [3, 2, 1, 3, 5, 6, 7, 8] */ console.log('arr9 splice(4,1)之后\n', arr9); /* [4] */ console.log('arr10'); console.log(arr10); let arr11 = arr9.splice(2,0,333,444); /* [3, 2, 333, 444, 1, 3, 5, 6, 7, 8] */ console.log('在数组 arr9 的索引以及后面的位置上插入333,444后') console.log(arr9); /* pop() push() shift() unshift() toString() toLocaleString() 不做演示 */ /*============= ES5 ================*/ /* map() filter() every() some() reduce() reduceRight() lastIndexOf() */ let arr12 = arr9.map(x=>{ return x*x}); console.log('arr9 每个元素的平方 arr12\n',arr12); let arr13 = arr12.filter(x=>{return x%2==0}); console.log('arr12 中的偶数 arr13\n',arr13); console.log('arr13 中是否有3的倍数\n',arr13.some(x=>{ return x%3===0;})); console.log('arr12 中是否每个数都是偶数\n',arr12.every(x=>{ return x%2===0;})); console.log('arr13 中是否每个数都是偶数\n',arr13.every(x=>{ return x%2===0;})); console.log('arr13 各个元素的和\n',arr13.reduce((x,y)=>{ return x+y;})); /*============= ES5.1 ================*/ /* indexOf() Array.isArray(maybeArr) forEach(func(currentValue, index, array){}) Array[Symbol.species] */ /* [1, 2, 3, [11,22]] */ /*============= ES6 ================*/ /* Array.from() Array.of() copyWithin() find() findIndex() fill() entries() keys() values() for…of */ /* [1, 2, 3, Array[3]] */ let arr14:any[] = Array.of(1,2,3,[11,22,33]); console.log('arr14\n', arr14 ); arr14 = Array.from('1234567'); /* ["1", "2", "3", "4", "5", "6", "7"] */ console.log('arr14\n', arr14 ); let arr15 = arr14.map(x=>{ return parseInt(x,10) }); /* [1, 2, 3, 4, 5, 6, 7] */ console.log('arr14 各个元素转换为数值得到 arr15\n', arr15 ); /* 6 */ console.log('arr15 中第一个大于5的元素\n', arr15.find(x=>{ return x>5} ) ); console.log('arr15 中第一个大于5的元素的索引\n', arr15.findIndex(x=>{ return x>5} ) ); let ptr1 = arr15.entries() console.log('arr15 的entries的一个元素\n', ptr1.next() ); console.log('arr15 的entries的一个元素\n', ptr1.next() ); console.log('arr15 的entries的一个元素\n', ptr1.next() ); let ptr2 = arr15.keys(); console.log('arr15 的keys的一个元素\n', ptr2.next() ); console.log('arr15 的keys的一个元素\n', ptr2.next() ); console.log('arr15 的keys的一个元素\n', ptr2.next() ); console.log('arr15 的keys的一个元素\n', ptr2.next() ); for(let k of ptr2){ console.log('ptr2 的剩余元素值之一:',k); } arr15.fill(0,1,3); console.log('使用 0 填充 arr5 的 [1,3) 个元素',arr15); arr15.fill(2,3); console.log('使用 2 填充 arr5 的 [3,-1] 个元素',arr15); arr15.fill(0); console.log('使用 0 填充 arr5 的各个元素',arr15); /*============= ES2016 ================*/ /* includes() */ let arr16 = [11,22,33,44,55,66]; console.log('arr16\n', arr16); console.log('arr16 是否包含 22 \n', arr16.includes(22)); console.log('arr16 是否包含 99 \n', arr16.includes(99)); /*============= 数组去重 ================*/ /*============= TypeScript 不识别原型链 ================*/ /* Array.prototype.removeDulEls_v1 = function(): any[] { let temp:any[] = []; for (let i = 0; i < this.length; i++) { if(this[i] !in temp){ temp.push(this[i]); } } return temp; }; Array.prototype.removeDulEls_v2 = function (): any[] { let temp:any[] = []; label:for(let i=0;i<this.length;i++){ for(let j=0; j<temp.length;j++ ){ if(temp[j]==this[i]) continue label; } temp[temp.length] = this[i]; } return temp; } Array.prototype.removeDuplicates_v1 = function (): any[]{ let temp:any[] = []; this.sort(); for(let i=0;i<this.length;i++){ if(this[i]==this[i+1]) {continue} temp[temp.length]=this[i]; } return temp; } */ function removeDulElForArr_V0(a:any[]): any[] { return a.filter((it, i, ar) => ar.indexOf(it) === i); } function removeDulElForArr_V1(a:any[]):any[] { let seen:any = {}; return a.filter(function(item) { return seen.hasOwnProperty(item) ? false : (seen[item] = true); }); } function removeDulElForArr_V2(a:any[]):any[] { let prims:any = {"boolean":{}, "number":{}, "string":{}}; let objs:any[] = []; return a.filter(function(item) { let type = typeof item; if(type in prims){ return prims[type].hasOwnProperty(item) ? false : (prims[type][item] = true); }else{ return objs.indexOf(item) >= 0 ? false : objs.push(item); } }); } function removeDulElForArr_V3(a:Array<any>):Array<any> { let seen:any = {}; let out = []; let len = a.length; let j = 0; let item:any; for(let i = 0; i < len; i++) { item = a[i]; if(seen[item] !== 1) { seen[item] = 1; out[j++] = item; } } return out; } /* 受 http://locutus.io/php/array/array_unique/ 的启发。 */ function array_unique (inputArr:Array<any>):Array<any> { let tmpArr:any = [] tmpArr = inputArr.filter((x)=>{return tmpArr.indexOf(x) === -1;}) return tmpArr; } /* TypeScript 不识别原型链 */ /*arr101 = arr9.removeDulEls_v1(); console.log(arr101);*/ let arr101 = removeDulElForArr_V1(arr9); console.log('arr9 去重后的 arr11'); console.log(arr101); arr101 = removeDulElForArr_V2(arr9); console.log(arr101); arr101 = removeDulElForArr_V3(arr9); console.log(arr101); arr101 = array_unique(arr9); console.log('受PHP\'s array_unique in JavaScript 启发的实现\n',arr101); arr101 = [...new Set(arr9)]; console.log(arr101); arr101 = Array.from(new Set(arr9)); console.log(arr101);
结论是: tsp 工具需要增加 watch 到 文件更改后自动刷新浏览器,有时间了再改进吧。
本文首发酷威普和51CTO,转载请注明。
转载于:https://blog.51cto.com/13239289/1958611