阅读 58

编程题

Javascript包含对象的数组去重

题目

将一数组中重复的值去掉。
例如:

var test = [{ 2: "a", a: "aa" }, { 2: "a", a: "aa" }, { ab: "a", a: "aa" }, {}, {}, 1, 1, 2, '2', '2', 3, 4, 5, {}, { 2: "a", a: "aa" }]

代码

 Array.prototype.clearRepeat = function () {
      var result = [], obj = {};
      for (var i = 0; i < this.length; i++) {
        // 处理对象
        if (typeof (this[i]) === "object") {
          var objName = "Object:";
          for (var x in this[i]) {
            objName += x;
            objName += this[i][x];
          }
          if (!obj[objName]) {
            obj[objName] = "new";
            result.push(this[i]);
          }
        }
        // 处理非对象
        else if (!obj[typeof (this[i]) + this[i]]) {
          result.push(this[i]);
          obj[typeof (this[i]) + this[i]] = "new";
        }
      }
      return result;
    }
    // console.log(test.clearRepeat());
复制代码

javascript将扁平的数据转为树形结构

题目

将 一个扁平的数组(一维数组)代表的菜单结构转换成一个多层级的菜单结构。

一维数组中每一个元素必须要包含以下属性:

  1. 拥有一个唯一的id
  2. 拥有一个parentId, 这个指向它父级的id

其他则为每一个元素中的一些信息。
例如:

 let arr = [
      { id: 2, name: '部门B', parentId: null },
      { id: 3, name: '部门C', parentId: 1 },
      { id: 4, name: '部门D', parentId: 1 },
      { id: 5, name: '部门E', parentId: 2 },
      { id: 7, name: '部门G', parentId: 2 },
      { id: 6, name: '部门F', parentId: 3 },
      { id: 1, name: '部门A', parentId: 2 },
      { id: 8, name: '部门H', parentId: 4 }
    ];
复制代码

代码

 // 递归写法
    function toTree(list, parId) {
      let len = list.length;
      function loop(parId) {
        let res = [];
        for (let i = 0; i < len; i++) {
          let item = list[i];
          if (item.parentId == parId) {
            // 给当前节点对象添加属性
            item.children = loop(item.id);
            res.push(item);
          }
        }
        return res;
      }
      return loop(parId);
    }
    // console.log(toTree(arr, null));
    
    // 非递归写法
    function totree(list, parId) {
      let obj = {};
      let result = [];
      list.map(el => {
        obj[el.id] = el;
      })
      for (let i = 0, len = list.length; i < len; i++) {
        let id = list[i].parentId;
        if (id == parId) {
          result.push(list[i]);
          continue;
        }
        if (obj[id].children) {
          obj[id].children.push(list[i]);
        } else {
          obj[id].children = [list[i]];
        }
      }
      return result;
    }
  // console.log(totree(arr, null));
复制代码

数组中重复和缺失的数

题目描述(大致)

数组无序、范围1~n, 缺一个元素,重复一个元素
如: arr= [3, 1, 3]
Output: 2, 3 (缺2, 重复3)

思路

  • 1.先使用辅助空间,去重,将重复的数字加入数组中
  • 2.在遍历数组,将缺失的数加入数组中

代码

function findNums (nums) {
  var arr = [];
  var set = new Set();
  nums.forEach(x => {
    if (!set.has(x)) {
      set.add(x);
    } else {
      arr.push(x);
    }
  })
  for (let i = 1; i <= nums.length; i++) {
    if (set.has(i)) {
      set.delete(i);
    } else {
      arr.push(i);
    }
  }
  return arr;
}
复制代码

参考文献

文章分类
前端
文章标签