Toc
0 results found
FBB
JS手写实现题
2019/12/10 前端 JS 笔试

笔试面试期间会遇到一些采用 JS 实现的算法题。
在这里做一个归档,尽可能多的写出解决方案是我的初衷。

  1. 函数组合运行
/**
 * 说明:实现一个方法,可将多个函数方法按从左到右的方式组合运行。
 * 如`composeFunctions(fn1,fn2,fn3,fn4)`等价于`fn4(fn3(fn2(fn1))`。
 * 示例:
 *  const add = x => x + 1;
 *  const multiply = (x, y) => x * y;
 *  const multiplyAdd = composeFunctions(multiply, add);
 *  multiplyAdd(3, 4) // 返回 13
 */

function composeFunctions() {
  const args = [...arguments];
  if (args.length === 1) {
    //如果只有一个函数,直接当前函数
    return args[0];
  }
  return function() {
    //否则返回一个新的函数
    const args1 = [...arguments];
    return args.reduce((pre, curr) => {
      if (typeof pre === "function") {
        //如果是第一次执行,pre为function,之后为执行函数返回值
        return curr(pre(...args1));
      }
      return curr(pre);
    });
  };
}
  1. 扁平化
/*
 * 说明:请实现 flatten(input) 函数,input 为一个 javascript 对象(Object 或者 Array),返回值为扁平化后的结果。
 * 示例:
 *   var input = {
 *     a: 1,
 *     b: [ 1, 2, { c: true }, [ 3 ] ],
 *     d: { e: 2, f: 3 },
 *     g: null,
 *   }
 *   var output = flatten(input);
 *   output如下
 *   {
 *     "a": 1,
 *     "b[0]": 1,
 *     "b[1]": 2,
 *     "b[2].c": true,
 *     "b[3][0]": 3,
 *     "d.e": 2,
 *     "d.f": 3,
 *     // "g": null,  值为null或者undefined,丢弃
 *  }
 */

function isObject(obj) {
  //判断是不是对象
  return Object.prototype.toString.call(obj) === "[object Object]";
}

function isArray(obj) {
  //判断是不是数组
  return Array.isArray(obj);
}

function isRemove(obj) {
  //判断是不是null或者undefined
  return obj === null || obj === undefined;
}

function _flat(prekey, input) {
  let result = {};
  if (isObject(input)) {
    //是对象
    for (let key in input) {
      result = Object.assign(result, _flat(prekey + "." + key, input[key]));
    }
  } else if (isArray(input)) {
    //是数组
    for (let key in input) {
      result = Object.assign(
        result,
        _flat(prekey + "[" + key + "]", input[key])
      );
    }
  } else if (!isRemove(input)) {
    //不是null或者undefined
    result[prekey] = input;
  }
  return result;
}
  1. 数组交错重排序
/* 数组交错重排序
 * 说明:给定一个数组,按指定个数拆分多份,并对每一份进行升序排序,
 * 比如一个6个数据项的数组,指定个数为3,即把数组按 2 份排序
 * 示例:
 * const list = [4, 2, 5, 6, 3, 1];
 * // 按每 2 个一份分别进行升序排序
 * interlaceSort(list, 2); [2, 4, 5, 6, 1, 3]
 * interlaceSort(list, 3); [2, 4, 5, 1, 3, 6]
 * interlaceSort(list, 6); [1, 2, 3, 4, 5, 6]
*/

function interlaceSort(list, count) {
  let result = [];
  while (list.length) {
    //list.splice(0, count) 拿到count个数据,并且改变原数组
    result = result.concat(list.splice(0, count).sort((a, b) => a - b));
  }
  return result;
}
打赏
支付宝
微信
本文作者:FBB
版权声明:本文首发于FBB的博客,转载请注明出处!