目录: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)