在最近的angular4项目,遇上这么一项数据处理需求:已知有多个任务和多个人,每个任务都有一个人或多个人参与,每个人也加入了一个或多个任务,那么这两个数据对象该如何互相之间得到? 其实现实中类似的还有很多。
例如输入:
const taskListMembers = {
p1: ['zs', 'wu', 'zl'],
p2: ['li', 'zl'],
p3: ['wu', 'lat'],
p4: ['zs'],
p5: ['zl', 'qwe', 'wu', 'li'],
p6: ['wu', 'lat']
};
输出:
const memberListTasks ={
zs: ['p1', 'p4'],
wu: ['p1', 'p3', 'p5', 'p6'],
zl: ['p1', 'p2', 'p5'],
li: ['p2', 'p5'],
lat: ['p3', 'p6'],
qwe: ['p5']
};
这里首先肯定在该函数中建立一个新对象作为容器,再对输入对象进行迭代,这里用的虽是ts但大部分还是js的语法。以下直接上代码:
function getMemberInTasks(taskMembers: any) {
const memberTasks = {};
for (let pId in taskMembers) {
<string[]>taskMembers[pId].forEach((tm: string, k: number, self: string[]) => {
memberTasks[tm] = !memberTasks[tm] ? [] : memberTasks[tm];
self.some((tm2: string) => tm2 === tm) && memberTasks[tm].push(pId);
});
}
return memberTasks
}
这里值得注意的是数组的forEach方法中的回调函数第三个参数就是该数组本身,再运用数组some迭代方法验证只要有一个符合的,即返回true。
js如何实现排列组合
例如输入[1,2,3],得到[[1,2,3], [1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]],这种问题的算法时间复杂度更高出一级,我也是今天想出来了过一段时间就不一定记得起来了,闭包中递归才能得到最后结果:
function arrange(arr) {
const brr = [],
len = arr.length;
return (function (ary) {
for (let i = 0; i < len; i++) {
let tmp = arr[i];
if (ary.length === len - 1) {
if (ary.indexOf(tmp) === -1) {
brr.push(ary.concat(tmp))
}
continue
}
if (ary.indexOf(tmp) === -1) {
arguments.callee(ary.concat(tmp))
}
}
return brr
})([])
}
console.dir(arrange([1, 2,3]));