// 快速排序
const quickSort = (nums) => {
if (nums.length <= 1) return nums;
let left = [], right = [];
let base = nums.splice(Math.floor(nums.length / 2), 1)[0];
nums.forEach(function(cur) {
if (cur < base) left.push(cur);
else right.push(cur);
})
return quickSort(left).concat(base, quickSort(right));
}
// 冒泡排序
const bubbleSort = (nums) => {
for (let k = 0; k < nums.length - 1; k++) {
for (let i = 0; i < nums.length - k - 1; i++) {
if (nums[i] > nums[i + 1]) {
[nums[i], nums[i + 1]] = [nums[i + 1], nums[i]];
}
}
}
}
// 选择排序
const selectSort = (nums) => {
for (let k = 0; k < nums.length - 1; k++) {
let p = k;
for (let i = k + 1; i < nums.length; i++) {
if (nums[i] < nums[p]) {
p = i;
}
}
[nums[k], nums[p]] = [nums[p], nums[k]];
}
}
/**
* URL 拆解问题
* --- 题目描述 ---
*
* 实现一个函数,可以对 url 中的 query 部分做拆解,返回一个 key: value 形式的 object
*
* --- 实例 ---
*
* 输入:'http://sample.com/?a=1&e&b=2&c=xx&d#hash'
* 输出:{a: 1, b: 2, c: 'xx', d: ''}
*/
function getQueryObj(url) {
let arr = url.split('?')[1].split('#')[0].split('&');
const res = {};
arr.forEach(function(e) {
const [key, value] = e.split('=')
if (!value) res[key] = '';
else res[key] = value;
});
return res;
}
/**
* URL 拆解问题
* --- 题目描述 ---
*
* 实现一个 parseParem 函数,将 url 转化为指定结果
*
* --- 测试用例 ---
*
* 输入:url = 'http://www.domain.com/?user=anonymous&id=123&id=456&city=%E5%8C%97%E4%BA%AC&enabled'
* 输出:
* {
* user:'anonymous',
* id:[123,456],// 重复出现的 key 要组装成数组,能被转成数字的就转成数字类型
* city:'北京',// 中文需解码
* enabled: true // 未指定值的 key 与约定为 true
* }
*/
function parseParem(url) {
const arr = url.split('?')[1].split('&');
const res = {};
arr.forEach(function(e) {
var [key, value] = e.split('=');
if (!value) res[key] = true;
else {
if (key in res) {
if (Array.isArray(res[key])) {
res[key].push(value);
} else {
res[key] = [res[key]].concat(value);
}
} else {
res[key] = decodeURI(value);
}
}
});
return res;
}
/**
* 将 HTTP header 转换成 js 对象
* --- 题目描述 ---
*
* 实现一个方法,把 HTTP 文本形式(字符串)的 header 转换成 JS 对象。
*
* --- 测试用例 ---
*
* 输入:
* `Accept-Ranges: bytes
* Cache-Control: max-age=6000, public
* Connection: keep-alive
* Content-Type: application/javascript`
* 输出:
* {
* "Accept-Ranges": "bytes",
* "Cache-Control": "max-age=6000, public",
* Connection: "keep-alive",
* "Content-Type": "application/javascript"
* }
*
* --- 解题思路 ---
*
* 1. 首先将每行数据作为数组的一个元素
* 2. 将每个元素使用冒号分割,前面为 `key`,后面为 `value`。
*/
const solution = (s) => {
const arr = s.split('\n');
const res = {};
arr.forEach(function(e) {
const [key, value] = e.split(': ');
res[key] = value;
});
return res;
}
/*
* 将数组化为树形结构
*
*/
/*
* 数组扁平化
* var arr = [1, [2, [3, 4]]];
*/
// 递归
function flatten(arr) {
var res = [];
for (let i = 0; i < arr.length; i++) {
if (Array.isArray(arr[i])) {
res = res.concat(flatten(arr[i]));
} else res.push(arr[i]);
}
return res;
}
// es6 拓展运算符
// var arr = [1, [2, [3, 4]]];
// console.log(arr.flat(2));
// es6 拓展运算符
function flatten2(arr) {
while (arr.some(e => Array.isArray(e))) {
arr = [].concat(...arr)
}
return arr;
}
/**
* --- 题目描述 ---
*
* 补充函数的 TODO 部分,模拟 lodash 中的 _.get() 函数。
*
* --- 测试用例 ---
*
* 输入:
* const obj = { selector: { to: { toutiao: "FE Coder"} }, target: [1, 2, { name: 'byted'}]};
* get(obj, 'selector.to.toutiao', 'target[0]', 'target[2].name')
* 输出:
* ['FE coder', 1, 'byted']
*/
/*
* 深拷贝
*/
function deepClone(obj) {
if (typeof obj != 'object' || obj == null) return obj;
let res;
if (obj instanceof Array) res = [];
else res = {};
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
res[key] = deepClone(obj[key]);
}
}
return res;
}
/*
* 浅拷贝
*/
const hero = {
name: 'Batman',
city: 'Gotham'
};
// **********************方法一**********************
const heroEnhancedClone = {
...hero,
name: 'Batman Clone',
realName: 'Bruce Wayne'
};
// **********************方法二**********************
const { ...heroClone } = hero;
// **********************方法三**********************
const heroClone3 = Object.assign({}, hero);
console