在最近的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]));