跟我学几个常用的数组方法
const overWrite = Symbol('overWrite')
class ArrayHandle{
constructor(){
this[overWrite]()
}
[overWrite](){
Array.prototype.change = function(callback){
if(typeof callback != 'function'){return new Error('${callback} is not function')}
for(let i = 0
let isDel = callback.call(this,this[i],i)
!isDel && this.splice(i,1) && i--
}
return this
}
}
isHasPro(obj,pro){
return obj.hasOwnProperty(pro)
}
//判断是否是对象字面量
isPlainObject(obj){
let flag = false
if(!obj || typeof obj != 'object'){return flag
if(this.isHasPro(obj.constructor.prototype,"isPrototypeOf")){
flag = true
}
return flag
}
//伪数组转直
arrayLike(arrLike){
return Array.from ? Array.from(arrLike) : Array.prototype.slice.call(arrLike)
}
//生成自然数
times(num,isIncludeZero){
isIncludeZero = isIncludeZero||0
let arr = [],i = 0
isIncludeZero && (i = -1,isIncludeZero = -1)
while(num>isIncludeZero){
num--
arr.push(++i)
}
return arr
}
//一维到二维
toTwoArray(arr,num){
let rows = []
num = num||7
arr = arr.concat()
while(arr.length > 0) {
rows.push(arr.splice(0, num))
}
return rows
}
//二维数组转一维
flat(arr){
return arr.reduce((a, b)=>{
return a.concat(b)
})
}
//数组拼接
arrayConcact(...arrs){
let target = arrs.shift()
arrs.forEach(arr=>{
Array.prototype.push.apply(target,arr)
})
return target
}
//获取json数组中某个字段
getFields(jsonArr,feild) {
jsonArr = jsonArr || []
return jsonArr.map(function(json){
return json[feild]
})
}
/**
* 获取json数组中的对象
* getJson([{name:'ck',...},{name:'ck2',...}],{name:'ck2'})
* getJson([{name:'ck',...},{name:'ck2',...}],function(item,i){
* return item.name == 'ck'
* })
*/
getJson(jsonArr,rule){
for(let i=0,len=jsonArr.length
let item = jsonArr[i]
if(isPlainObject(rule)){
let key = Object.keys(rule)[0]
if(item[key] == rule[key]){
return item
}
}
if(typeof rule == 'function'){
let isTargetObj = rule.call(jsonArr,item,i)
if(isTargetObj){
return item
}
}
}
}
//是否是空数组
isEmptyArr(arr){
return JSON.stringify(arr) === '[]'
}
/**
* 根据值删除数组中的元素
* delValInArray([1,3,4,2,7,3,4,6,2],7)==>[1,3,4,2,3,4,6,2]
* delValInArray([1,3,4,2,7,3,4,6,2],3,true)==>[1,4,2,4,7,6,2]
* delValInArray([1,3,4,2,7,3,4,6,2],[3,4])==>[1,2,7,3,4,6,2]
* delValInArray([1,3,4,2,7,3,4,6,2],[3,4],true)==>[1,2,7,6,2]
* delValInArray([{name:'ck',...},{name:'ck2',...}],function(item,i){
* return item.name == 'ck'
* })
*/
delValInArray(arr,val,global=false){
if(typeof val == 'function'){
return arr.change((item,i)=>{
return !val.call(arr,item,i)
})
}else{
val = Array.isArray(val) ? val : [val]
val.forEach(item=>{
let index = arr.indexOf(item)
if(global){
while(arr.indexOf(val) > -1){
arr.splice(index,1)
}
}else{
arr.splice(index,1)
}
})
return arr
}
}
//数组去重
uniArr(arr,field){
for(let i=0
for(let j=i+1
let prev = field ? arr[i][field] : arr[i]
let next = feild ? arr[j][field] : arr[j]
prev == next && arr.splice(j,1) && j--
}
}
return arr
}
/**
* 简单节点转父子树
* 数据格式如下:
* var nodes =[
{ id:1, pId:0, name:"随意勾选 1"},
{ id:11, pId:1, name:"随意勾选 1-1"},
{ id:111, pId:11, name:"随意勾选 1-1-1"},
{ id:112, pId:11, name:"随意勾选 1-1-2"},
{ id:12, pId:1, name:"随意勾选 1-2"},
{ id:121, pId:12, name:"随意勾选 1-2-1"},
{ id:122, pId:12, name:"随意勾选 1-2-2"},
{ id:2, pId:0, name:"随意勾选 2"},
{ id:21, pId:2, name:"随意勾选 2-1"},
{ id:22, pId:2, name:"随意勾选 2-2"},
{ id:221, pId:22, name:"随意勾选 2-2-1"},
{ id:222, pId:22, name:"随意勾选 2-2-2"},
{ id:23, pId:2, name:"随意勾选 2-3"}
]
*/
parSubTree(nodes){
var nodePoint = {},node = []
// 删除所有 children属性,以防止多次调用
nodes.forEach(node=>{
delete node.children
})
nodes.forEach(node=>{
nodePoint[node.id] = node
})
nodes.forEach(node=>{
if(node.pId in nodePoint){
(nodePoint[node.pId].children || (nodePoint[node.pId].children = [])).push(node)
}else{//不在则是顶级节点
node.push(node)
}
})
return node
}
/**
* 父子树转简单节点
* @param {*} nodes
* @param {*} childName
* @param {*} id
*/
parSubToSimpleTree(nodes,childName,id){
childName = childName || 'children'
id = id || 'id'
let level = 1
,simpleNodesFn = function(nodes,pId){
let simpleNodes = []
nodes.forEach(node=>{
node.pId = pId
node.level = level
simpleNodes.push(node)
let childs = node[childName]
if(childs && childs.length>0){
level++
simpleNodes = simpleNodes.concat(simpleNodesFn(childs,node[id]))
level--
}
})
return simpleNodes
}
,simpleNodes = simpleNodesFn(nodes,null)
simpleNodes.forEach(function(node){
node[childName] && delete node[childName]
})
return simpleNodes
}
}