我的前端之路所涉及的数据结构处理

目录:1、级联选择器;2、将公司结构扁平对象 转化为 树形对象;3、冒泡排序;4、Number 数组中的最大差值;5、生成斐波那契额数列;6、数组去重

一、级联选择器
    需要先将下文 part one 中的数据结构转换成 part two 中的数据结构

// part one
var data = [{
  "province": "浙江",
  "city": "杭州",
  "name": "西湖"
}, {
  "province": "四川",
  "city": "成都",
  "name": "锦里"
}, {
  "province": "四川",
  "city": "成都",
  "name": "方所"
}, {
  "province": "四川",
  "city": "阿坝",
  "name": "九寨沟"
}]

// part two
var data = [{
  "value": "浙江",
  "children": [{
    "value": "杭州",
    "children": [{
      "value": "西湖"
    }]
  }]
}, {
  "value": "四川",
  "children": [{
    "value": "成都",
    "children": [{
      "value": "锦里"
    }, {
      "value": "方所"
    }]
  }, {
    "value": "阿坝",
    "children": [{
      "value": "九寨沟"
    }]
  }]
}]

    解决方法:

function transObject(tableData, keys) {
  let hashTable = {}, res = []
  for (let i = 0; i < tableData.length; i++) {
    let arr = res, cur = hashTable
    for (let j = 0; j < keys.length; j++) {
      let key = keys[j], filed = tableData[i][key]
      if (!cur[filed]) {
        let pusher = {
          value: filed
        }, tmp
        if (j !== (keys.length - 1)) {
          tmp = []
          pusher.children = tmp
        }
        cur[filed] = { $$pos: arr.push(pusher) - 1 }
        cur = cur[filed]
        arr = tmp
      } else {
        cur = cur[filed]
        arr = arr[cur.$$pos].children
      }
    }
  }
  return res
}
transObject(data, ['province', 'city', 'name'])

    此方法使用了 trie 树原理,好处是:此时 keys 的值与长度无关了,所以这是个通用方法,当级数更多或更少时都可以使用,如:

    var data = [{
		"province": "浙江",
		"city": "杭州",
		"county": "西湖区",
		"zhen": "三墩镇",
		"xiaoqu": "慧仁家园"
	}, {
		"province": "安徽",
		"city": "安庆",
		"county": "宿松县",
		"zhen": "汇口镇",
		"xiaoqu": "曹湖村"
	}, {
		"province": "安徽",
		"city": "安庆",
		"county": "望江县",
		"zhen": "华阳镇",
		"xiaoqu": "江调村"
	}]
	transObject(data, ['province', 'city', 'county', 'zhen', 'xiaoqu'])

二、将公司结构扁平对象 转化为 树形对象

var input = {
  h3: {
    parent: 'h2',
    name: '副总经理(市场)'
  },
  h1: {
    parent: 'h0',
    name: '公司机构'
  },
  h7: {
    parent: 'h6',
    name: '副总经理(总务)'
  },
  h4: {
    parent: 'h3',
    name: '销售经理'
  },
  h2: {
    parent: 'h1',
    name: '总经理'
  },
  h8: {
    parent: 'h0',
    name: '财务总监'
  },
  h6: {
    parent: 'h4',
    name: '仓管总监'
  },
  h5: {
    parent: 'h4',
    name: '销售代表'
  },
  h0: {
    parent: '',
    name: 'root'
  }
};
function plain2Tree (obj) {
  var key, res
  for(key in obj) {
    var parent = obj[key].parent
    if(parent === '') {
      res = obj[key]
    } else {
      obj[parent][key] = obj[key]
    }
  }
  console.log(res)
  // return res
}
plain2Tree(input)

三、冒泡排序

var babbleData = [2,1,54,3,13,5,62,12];
function bubbleSort(arr) {
  var i = (j = 0);
  for (i = 1; i < arr.length; i++) {
    for (j = 0; j <= arr.length - i; j++) {
      var temp = 0;
      if (arr[j] > arr[j + 1]) {
        temp = arr[j];
        arr[j] = arr[j + 1];
        arr[j + 1] = temp;
      }
    }
  }
  console.log(arr)
}
bubbleSort(babbleData)

四、Number 数组中的最大差值

var getMaxProfitData = [2,1,54,3,13,5,62,12];
function getMaxProfit(arr){
  var min = arr[0], max = arr[0];
  for(var i=0;i<arr.length;i++){
      if(arr[i]<min)
          min = arr[i];
      if(arr[i]>max)
          max = arr[i];
  }
  console.log(max - min)
  // return max - min;
}
getMaxProfit(getMaxProfitData)

五、生成斐波那契额数列

function getFibonacci(n) {
  var fibarr = [];
  var i = 0;
  while(i < n) {
      if(i <= 1) {
          fibarr.push(i);
      } else {
          fibarr.push(fibarr[i - 1] + fibarr[i - 2])
      }
      i++;
  }
  console.log(fibarr)
  // return fibarr;
}
getFibonacci(12)

六、数组去重(方法较多)

// 方法一:
var getUniqueData = [1,2,3,3,5,2,1,2,5,4];
function unique1(array){ 
	var n = []; 
	for(var i = 0; i < array.length; i++){ 
		if (n.indexOf(array[i]) == -1) {
			n.push(array[i]); 
		}
	}
	return n; 
}
console.log(unique1(getUniqueData));

// 方法二(es6):
var getUniqueData = [1,2,3,3,5,2,1,2,5,4];
var resultarr = [...new Set(getUniqueData)]; 
console.log(resultarr);

// 方法三:(只是方法一的不同写法而已)
var getUniqueData = [1,2,3,3,5,2,1,2,5,4];
function unique(arr){
  var obj = {}
  var data = []
  for(var i in arr){
      if(!obj[arr[i]]){
          obj[arr[i]] = true;
          data.push(arr[i]);
      }
  }
  console.log(data)
  // return data;
}
unique(getUniqueData)

猜你喜欢

转载自blog.csdn.net/BetterGG/article/details/85338618