昨天帮同事解决问题,于是诞生了“超优雅!两行代码搞定 php 无限级分类 获取顶级分类ID”这篇文章。

晚上回家做自己的node.js项目的时候,又遇到关于无限级分类的问题了。
其实也不是“遇到”,而是强迫症发作 不睡觉 干脆起床,把之前用递归现实的版本,改成用循环实现了。

这次要解决的问题是:根据分类ID,获取所有下级分类的ID
这里说的“所有下级分类”,是包含下级、下下级、下下下级……

另外刚好在学习ES6,于是用上了Set对象。
首先还是要将数据处理成{ id:pid, ... }这种格式,以下是我的数据。

var idPidArr = {
  '1': 2,
  '2': 0,
  '3': 2,
  '4': 43,
  '5': 2,
  '6': 2,
  '7': 0,
  '8': 0,
  '9': 1,
  '10': 1,
  '11': 1,
  '12': 1,
  '13': 1,
  '14': 1,
  '15': 0,
  '16': 1,
  '17': 102,
  '18': 43,
  '19': 43,
  '20': 3,
  '21': 3,
  '22': 43,
  '23': 43,
  '24': 5,
  '25': 43,
  '26': 43,
  '27': 43,
  '28': 4,
  '29': 4,
  '30': 4,
  '31': 43,
  '32': 111,
  '33': 5,
  '34': 43,
  '35': 5,
  '36': 88,
  '37': 43,
  '38': 43,
  '39': 43,
  '40': 6,
  '41': 70,
  '42': 6,
  '43': 0,
  '44': 43,
  '45': 43,
  '46': 8,
  '47': 8,
  '48': 43,
  '49': 8,
  '50': 43,
  '51': 67,
  '52': 125,
  '53': 43,
  '54': 43,
  '55': 124,
  '56': 0,
  '57': 6,
  '58': 6,
  '59': 111,
  '60': 43,
  '61': 43,
  '62': 56,
  '63': 43,
  '64': 4,
  '65': 43,
  '66': 43,
  '67': 102,
  '68': 43,
  '69': 4,
  '70': 102,
  '71': 56,
  '72': 124,
  '73': 43,
  '74': 43,
  '75': 8,
  '76': 17,
  '77': 43,
  '78': 0,
  '79': 43,
  '80': 43,
  '81': 103,
  '82': 15,
  '83': 17,
  '84': 3,
  '85': 15,
  '86': 3,
  '87': 43,
  '88': 43,
  '89': 111,
  '90': 43,
  '91': 15,
  '92': 6,
  '93': 6,
  '94': 43,
  '95': 53,
  '96': 103,
  '97': 111,
  '98': 6,
  '99': 70,
  '100': 15,
  '101': 6,
  '102': 0,
  '103': 43,
  '104': 103,
  '105': 103,
  '106': 103,
  '107': 7,
  '108': 7,
  '109': 7,
  '110': 7,
  '111': 102,
  '112': 8,
  '113': 1,
  '114': 103,
  '115': 103,
  '116': 43,
  '117': 43,
  '118': 43,
  '119': 125,
  '120': 111,
  '121': 70,
  '122': 111,
  '123': 70,
  '124': 8,
  '125': 8,
  '126': 124,
  '127': 125,
  '128': 88,
  '129': 43,
  '130': 3,
  '131': 43,
  '132': 43,
  '133': 86,
  '134': 21,
  '135': 21,
  '136': 86,
  '137': 20,
  '138': 20 };

然后 假设要获取分类 ID: 8 的所有下级分类的 ID。

var bmid = 8;

var pids = new Set([bmid]);
do {
    var len = pids.size;

    for(var id in idPidArr) {
        if (pids.has(idPidArr[id])) {
            pids.add(Number(id));
            delete idPidArr[id]; // 感谢 @zhoutk 提醒
        }
    }
} while (pids.size>len);

console.log(Array.from(pids));

输出所有下级分类 ID 数组是 [ 8, 46, 47, 49, 75, 112, 124, 125, 126, 127, 52, 55, 72, 119 ]

然后……没有了,
为什么有一种虎头蛇尾的感觉呢?
代码已经够简洁了,应该不必逐行解释了吧……


哎~ 为什么我可以写出如此精妙的代码,
却永远猜不透“石化油服”的走势!!!
来一首五月天的《超人》体会一下我此刻的心情。

油炸癞疙宝 · 2016年03月12日

哈哈,顶一下

回复

zhoutk · 2016年03月14日

还可以优化,上一级已经处理过的节点,在下一级还会被处理!
比如,第一级是找8的子节点,在做for循环时还要对8进行一次判断,这是多余的。越往深走,多余的处理越多,呵呵!

回复

王道中强流 作者 · 2016年03月14日

有道理,我优化一下。赞

回复

transtone · 2016年03月15日

写成数据库函数直接读出数组来不是更爽?

回复

88888888888888888 · 2016年05月25日

本来是1级查2级,2级查3级
用has的话,查也能查,就是1级去has3级数据是多余的

回复

载入中...
王道中强流 王道中强流

1.5k 声望

发布于专栏

王道中强流

不为繁华易匠心

6 人关注