SOURCE

// 快速排序
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 命令行工具 X clear

                    
>
console