js常用的操作数组的方法(排序,去重,数组转成tree结构数组,根据指定节点获取所有父级)

排序,去重,数组转成tree结构数组,根据指定节点获取所有父级

1. 数组排序

var arr1 = [15, 8, 25, 3];
arr1.sort(function(a, b){
    
    
	return a - b; // 从小到大
})
console.log('非对象数组排序-从小到大:'  + JSON.stringify(arr1))


var arr2 = [15, 8, 25, 3];
arr2.sort(function(a, b){
    
    
	return b - a; // 从大到小
})
console.log('非对象数组排序-从大到小:'  + JSON.stringify(arr2))


var arr3 = [
	{
    
    age: 60},
	{
    
    age: 3},
	{
    
    age: 30},
	{
    
    age: 9},
];
arr3.sort(function(a, b){
    
    
	return a.age - b.age; // 从小到大
})
console.log('对象数组排序-从小到大:'  + JSON.stringify(arr3))

2. 数组去重

/** 对象数组去重
 * @param {Object} oldArr 需要去重的数组
 * @param {String} key 需要去重的对象属性
 */
function uniqueArrByObj (oldArr, key) {
    
    
    var newArr = [];
	var obj = {
    
    };
    for(var i =0; i<oldArr.length; i++){
    
    
         if(!obj[oldArr[i][key]]){
    
    
             newArr.push(oldArr[i]);
             obj[oldArr[i][key]] = true;
         }
     }
	return newArr;
}

/** 非对象数组去重
 * @param {Object} oldArr
 */
function unique1 (oldArr) {
    
    
   var newArr=[];
	for (var i = 0; i < oldArr.length; i++) {
    
    
		if(newArr.indexOf(oldArr[i])==-1){
    
    
			newArr.push(oldArr[i]);
		}
	}
	return newArr;
}
			
/** 非对象数组去重,ES6实现。基本思路:ES6提供了新的数据结构Set。它类似于数组,但是成员的值都是唯一的,没有    重复的值。
 * @param {Object} oldArr
 */
function uniqueArrBySet (oldArr) {
    
    
	var newArr = new Set(oldArr);
	return [...newArr];
} 
			
var objArr = [
	{
    
    name: '张三', age: 24},
	{
    
    name: '李四', age: 25},
	{
    
    name: '张三', age: 26},
	{
    
    name: '赵六', age: 29},
]
console.log('对象数组去重:'  + JSON.stringify(uniqueArrByObj(objArr, 'name')))
var arr = [2, 25, 36, 2, '36', '3']
console.log('非对象数组去重:'  + JSON.stringify(unique1(arr)))
console.log('非对象数组去重,Set实现:'  + JSON.stringify(uniqueArrBySet(arr)))

3. 数组转成tree结构

var menuList = [
	{
    
    
		"id": "1002",
		"name": "用户权限",
		"type": "1",
		"parentId": "",
		"state": 1,
		"menuCode": "B001",
		"menuIcon": "iconfont icon-quanxianguanli",
		"menuUrl": "user-authority",
		"sort": 4
	},
	{
    
    
		"id": "1002001",
		"name": "用户档案",
		"type": "2",
		"parentId": "1002",
		"state": 1,
		"menuCode": "B002",
		"menuIcon": "iconfont icon-yonghu",
		"menuUrl": "user-list",
		"sort": 0
	},
	{
    
    
		"id": "1002002",
		"name": "角色权限",
		"type": "2",
		"parentId": "1002",
		"state": 1,
		"menuCode": "B003",
		"menuIcon": "iconfont icon-permissions-list",
		"menuUrl": "role-list",
		"sort": 0
	},
	{
    
    
		"id": "1002003",
		"name": "菜单管理",
		"type": "2",
		"parentId": "1002",
		"state": 1,
		"menuCode": "B004",
		"menuIcon": "iconfont icon-caidan",
		"menuUrl": "menu-list",
		"sort": 0
	},
	{
    
    
		"id": "1003",
		"name": "基础资料",
		"type": "1",
		"parentId": "",
		"state": 1,
		"menuCode": "C001",
		"menuIcon": "iconfont icon-jichuziliao",
		"menuUrl": "base-list",
		"sort": 5
	},
	{
    
    
		"id": "1003001",
		"name": "公司档案",
		"type": "2",
		"parentId": "1003",
		"state": 1,
		"menuCode": "C002",
		"menuIcon": "iconfont icon-gongsixinxi",
		"menuUrl": "corp-list",
		"sort": 0
	},
	{
    
    
		"id": "1003002",
		"name": "店铺档案",
		"type": "2",
		"parentId": "1003",
		"state": 1,
		"menuCode": "C003",
		"menuIcon": "iconfont icon-dianpu",
		"menuUrl": "shop-list",
		"sort": 0
	},
	{
    
    
		"id": "1003003",
		"name": "商品档案",
		"type": "2",
		"parentId": "1003",
		"state": 1,
		"menuCode": "C004",
		"menuIcon": "iconfont icon-ziliaoku",
		"menuUrl": "goods-list",
		"sort": 0
	}
]

//data:带转换成树形结构的对象数组
//attributes:对象属性
var toTreeData = function(data, attributes) {
    
    
	 let resData = data;
     let tree = [];

     //找寻根节点
     for(let i = 0; i < resData.length; i++) {
    
    
         resData[i].children = resData[i].children || [];
         if(!resData[i][attributes.parentId] || resData[i][attributes.parentId] === '0') {
    
    
             tree.push(JSON.parse(JSON.stringify(resData[i])));
             resData.splice(i, 1);
             i--;
         }
     }

     //找寻子树
     var run = function(chiArr) {
    
    
         if(resData.length !== 0) {
    
    
             for(let i = 0; i < chiArr.length; i++) {
    
    
                 for(let j = 0; j < resData.length; j++) {
    
    
                     if(chiArr[i][attributes.id] === resData[j][attributes.parentId]) {
    
    
                         let obj = JSON.parse(JSON.stringify(resData[j]));
                         if (!chiArr[i].children) {
    
    
                             chiArr[i].children = []
                         }
                         chiArr[i].children.push(obj);
                         resData.splice(j, 1);
                         j--;
                     }
                 }
                 run(chiArr[i].children);
             }
         }
     }

     run(tree);
     return tree;
}

// 属性配置信息
let attributes = {
    
    
	id: 'id',
	parentId: 'parentId',
};
let treeData = toTreeData(menuList, attributes);

console.log(JSON.stringify(treeData));

4.根据指定节点获取所有父级

var getParentList = function (tree, func, path = []) {
    
    
 	if (!tree) return []
    for (const data of tree) {
    
    
         // 这里按照你的需求来存放最后返回的内容吧
         path.push(data.value)
         if (func(data)) return path
         if (data.children) {
    
    
             const findChildren = getParentList(data.children, func, path)
             if (findChildren.length) return findChildren
         }
         path.pop()
     }
     return []
}

var oldList = [{
    
    "label":"链接栏目","value":"1334057558398222371","parentvalue":"0","children":[]},{
    
    "label":"测试","value":"1334059448418713656","parentvalue":"0","children":[]},{
    
    "label":"列表模板","value":"1334061078203613251","parentvalue":"0","children":[{
    
    "label":"列表模板1","value":"1334061222558974015","parentvalue":"1334061078203613251","children":[]}]},{
    
    "label":"封面模板","value":"1334061443204530180","parentvalue":"0","children":[]}]
var newList= getParentList(oldList , dataRes=> dataRes.value==="1334061222558974015")
console.log(newList)

猜你喜欢

转载自blog.csdn.net/jstljspservlet/article/details/107555578