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将扁平的数据转为树形结构
题目
将 一个扁平的数组(一维数组)代表的菜单结构转换成一个多层级的菜单结构。
一维数组中每一个元素必须要包含以下属性:
- 拥有一个唯一的id
- 拥有一个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;
}
参考文献