js中兩個算法小問題

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章