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]));

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值