V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
pianjiao
V2EX  ›  程序员

我又来请教一个方法了。 掩面哭泣

  •  
  •   pianjiao · 2022-03-25 11:04:53 +08:00 · 5641 次点击
    这是一个创建于 977 天前的主题,其中的信息可能已经有所发展或是发生改变。
        const list = {
            email: {
                a: {
                    big: {
                        rule: ['abig'],
                        isShow: true, 
                        extends: [] 
                    },
                    small: {
                        rule: ['asmall'],
                        isShow: false,
                        extends: [] 
                    }
                },
                b: {
                    big: {
                        rule: ['bbig'],
                        isShow: true, 
                        extends: [] 
                    },
                    small: {
                        rule: ['bsmall'],
                        isShow: false,
                        extends: [] 
                    }
                },
            },
            qq: {
                a: {
                    big: {
                        rule: ['abigqq'],
                        isShow: true, 
                        extends: [] 
                    },
                    small: {
                        rule: ['asmallqq'],
                        isShow: false,
                        extends: [] 
                    }
                },
                b: {
                    big: {
                        rule: ['bbigqq'],
                        isShow: true, 
                        extends: [] 
                    },
                    small: {
                        rule: ['bsmallqq'],
                        isShow: false,
                        extends: [] 
                    }
                },
            },
        }
    

    比如说 我传入了 a big 那么就取 qq 和 email 下 a => big 里面的转化成下面格式的 对象

        const data = {
            rule: {
                email: ['abigemail'],
                qq: ['abigqq']
            },
            ishow: {
                email: true,
                qq: false
            },
            extends: {
                email: [],
                qq: []
            }
        }
    
    第 1 条附言  ·  2022-03-28 15:39:11 +08:00
    问个问题,还能让某些人,教育成这样。。

    溜了溜了。

    谢谢解答的各位。已感谢

    溜了

    溜了
    第 2 条附言  ·  2022-03-28 15:44:59 +08:00
    还有这个帖子发了有好几天,

    应该是上周五发的,

    然后自己 参考之前一个也是格式转换的帖子,里面老哥的回复。

    自己写出了。自己的想要的转换格式方法。

    然后周末就没有上 v 站

    刚刚上来看看,因为没有登录。 看到自己的帖子这么多人回复。

    就登录上来回复一下大家。

    感谢帮助的各位老哥。

    也谢谢给出意见的几位。

    另外,我选择在 v 站发帖请教,肯定是自己解决不了,搜索也没有搜到解决方案,才发出来的。

    至于那么觉得问的问题 使 v 站 低龄化的话,麻烦里 block 我,眼不见心不烦。 谢谢
    43 条回复    2022-03-28 15:41:21 +08:00
    zcf0508
        1
    zcf0508  
       2022-03-25 11:15:42 +08:00 via Android
    让后端按要求返回数据
    pianjiao
        2
    pianjiao  
    OP
       2022-03-25 11:27:01 +08:00
    pengtdyd
        3
    pengtdyd  
       2022-03-25 11:32:49 +08:00   ❤️ 22
    别搞 IT 了吧,找个厂打螺丝吧
    Curtion
        4
    Curtion  
       2022-03-25 12:02:41 +08:00   ❤️ 1
    function getCustomData(a, b) {
    let data = {}
    for (let item in list) {
    for (let key in list[item][a][b]) {
    data[key] = {
    ...data[key],
    [item]: list[item][a][b][key]
    }
    }
    }
    return data
    }
    console.log(getCustomData('a', 'big'))
    flowerpiggy
        5
    flowerpiggy  
       2022-03-25 12:06:31 +08:00
    用 proxy 最方便。
    oneisall8955
        6
    oneisall8955  
       2022-03-25 12:16:15 +08:00 via Android   ❤️ 2
    絮我直言,为什么一个 map/dict 的变量是 list
    DOLLOR
        7
    DOLLOR  
       2022-03-25 12:19:19 +08:00 via Android
    @pengtdyd 看以往发帖记录,应该木材厂😂
    BingoXuan
        8
    BingoXuan  
       2022-03-25 12:25:35 +08:00   ❤️ 1
    假设你用的是 js ,导入 lodash 后
    {
    rule: {
    email: _.get(list,'email.a.big.rule'),
    qq: _.get(list,'qq.a.big.rule')
    },
    isShow: {
    email: _.get(list,'email.a.big.isShow'),
    qq: _.get(list,'qq.a.big.isShow')
    },
    extends: {
    email: _.get(list,'email.a.big.extends'),
    qq: _.get(list,'qq.a.big.extends')
    }
    }
    superfatboy
        9
    superfatboy  
       2022-03-25 13:13:22 +08:00
    找个场,剪视频吧
    yousabuk
        10
    yousabuk  
       2022-03-25 13:43:47 +08:00 via iPhone
    哈哈哈哈😂你的工资是由 V 友支撑起来的吗?
    VagabondH
        11
    VagabondH  
       2022-03-25 16:25:08 +08:00   ❤️ 1
    const convert = (data) => {
    const result = {};

    const keysLevel1 = Object.keys(data);
    keysLevel1.forEach(k1 => {
    console.log(k1, 'k1');
    const keysLevel2 = Object.keys(data[k1]);
    keysLevel2.forEach(k2 => {
    console.log(k2, 'k2');
    const keysLevel3 = Object.keys(data[k1][k2]);
    if (!result[k2]) result[k2] = {};
    keysLevel3.forEach(k3 => {
    console.log(k3, 'k3');
    const keysLevel4 = Object.keys(data[k1][k2][k3]);
    if (!result[k2][k3]) result[k2][k3] = {};
    keysLevel4.forEach(k4 => {
    if (!result[k2][k3][k4]) result[k2][k3][k4] = {};
    result[k2][k3][k4][k1] = data[k1][k2][k3][k4];
    })
    })
    })
    });

    return result;
    };
    KJR5OR04CnCiWf02
        12
    KJR5OR04CnCiWf02  
       2022-03-25 16:34:13 +08:00
    木材厂是哪个?
    heyOhayo
        13
    heyOhayo  
       2022-03-25 17:24:35 +08:00
    找个厂上班吧。。。
    lee1997
        14
    lee1997  
       2022-03-25 19:29:59 +08:00   ❤️ 6
    v2 的回复也变得低龄化了吗?
    别人学习的问题,好好回复不就行了,不懂可以不回,嘲笑别人可以满足你的优越感?
    《请尽量让自己的回复能够对别人有帮助》
    keith1126
        15
    keith1126  
       2022-03-25 20:31:27 +08:00   ❤️ 2
    lee1997
        16
    lee1997  
       2022-03-25 21:15:40 +08:00 via Android
    @keith1126 你要求每一个人提问前先掌握这些东西? op 已经 show code ,问题也很简单,难道还不够是吗,你的意思是问题没提好应该进厂吗
    paradoxs
        17
    paradoxs  
       2022-03-25 21:26:59 +08:00
    说实在的,让后端重新给你处理一下,比你在这里琢磨更快。

    后端返回这种格式的数据是很简单的。
    keith1126
        18
    keith1126  
       2022-03-25 21:41:01 +08:00
    @lee1997 #16

    我什么也没说啊……你是不是认错了,我只是贴出一个《提问的智慧》,你觉得楼主做得符合这个指南,那就没事呗
    learningman
        19
    learningman  
       2022-03-25 21:58:59 +08:00 via Android
    @lee1997 楼主这不像是问问题,这都是最基本的操作,不好说有什么问的必要。
    像是什么呢?代为完成个人任务。
    这可不受欢迎。
    lee1997
        20
    lee1997  
       2022-03-26 08:57:05 +08:00 via Android
    @keith1126 😅 你回复我,让我以为 op 没有做到「提问的智慧」,所以就可以被嘲笑进厂呢
    lee1997
        21
    lee1997  
       2022-03-26 08:57:55 +08:00 via Android
    @learningman 呵呵,这也不至于嘲笑进厂这种地步吧
    seakingii
        22
    seakingii  
       2022-03-26 09:41:41 +08:00
    首先这问题也太简单了,就是一个 js 对象里面的元素查看的问题。以后如果大家都把最简单的问题拿来问,比如 hello,world 级的问题拿来问,这不是好事。我认为但凡把书好好看看,把学习视频学习下,不至于这么问。

    其次上面的那个 “v2 的回复也变得低龄化了吗?
    别人学习的问题,好好回复不就行了,不懂可以不回,嘲笑别人可以满足你的优越感?
    《请尽量让自己的回复能够对别人有帮助》” 的指责,没看出他的“回复”对楼主有帮助,也没看出他的“回复”对非楼主有帮助 ,所以,这是一个“自己做不到的人指责别人做不到”?
    placeholder
        23
    placeholder  
       2022-03-26 09:49:38 +08:00   ❤️ 1
    @lee1997 你的回复...对他有什么帮助???

    ???
    ericgui
        24
    ericgui  
       2022-03-26 10:22:10 +08:00
    虽然这个题确实傻

    但 v 站一直以来又嘲笑新人的“传统”,这很不好


    我当年也问过很多傻问题,这一路走来,也确实不易

    谁都不是娘胎出来就带着一个 CS 学位的,还请某些人手下留情,积点口德比较好
    seakingii
        25
    seakingii  
       2022-03-26 11:09:22 +08:00   ❤️ 2
    @ericgui 嘲笑是不对,
    但随便问问题就是对的?
    你也知道这问题“傻”,
    楼主自己也知道这问题“傻”,(看楼主的标题)
    为什么还要问这样的问题?
    浪费大家时间?


    像楼主这样的明知道不是正确的做法还来做的,为什么不能嘲笑?真的想好好解决问题,要么好好自学,要么花点成本现实在用”钞能力“来解决(找个老师或者培训班或者专人指导),现在搁这是打算自己不努力来白嫖?
    golangLover
        26
    golangLover  
       2022-03-26 13:09:14 +08:00 via Android
    笑了。这么多人说楼主傻的,结果只有八楼能给一个合适的答案,其他的写法都很累赘
    fortunezhang
        27
    fortunezhang  
       2022-03-26 14:03:38 +08:00
    首先我感觉这个应该由后端来处理。
    其次如果你处理的话,这能 each 遍历或者 filter 过滤。 没有什么好办法。
    最好还是由后端来处理。
    a852695
        28
    a852695  
       2022-03-26 14:26:04 +08:00
    问题感觉没有描述很清楚,传入 a big 是啥意思呢,可以更详细一点描述,方便解决问题
    a852695
        29
    a852695  
       2022-03-26 15:00:47 +08:00
    发表一些感触,看到楼主问题也想到曾经自己也啥都不懂,学电子专业出身,代码也是照着书一点点学,一点点验,知道一开始的不容易。现在工作了几年后看到 V2 上还是氛围那么好,程序员是一个很单纯的群体,没有弯弯绕绕,大部分争执也在于论技术,挺温暖的一个群体
    kingfalse
        30
    kingfalse  
       2022-03-26 15:48:30 +08:00 via Android
    活捉嘤嘤怪
    lee1997
        31
    lee1997  
       2022-03-26 19:44:57 +08:00 via Android
    @placeholder 我的帮助体现在改善环境,别动不动就开始嘲笑。那你的回复对我有什么帮助呢?
    lee1997
        32
    lee1997  
       2022-03-26 19:49:20 +08:00 via Android
    最后说一句,楼主这个帖子对我挺有帮助的,让我 b 了这些人。避免我以后发帖得到的回复都是嘲笑劝退的消极评论😅
    placeholder
        33
    placeholder  
       2022-03-26 23:32:22 +08:00   ❤️ 3
    @lee1997 ???

    你除了放了个地图炮你改善什么了?

    ???突然疑惑

    你想改善环境难道不应该从自己认真回答贴主所询问的问题开始吗?

    ???
    seakingii
        34
    seakingii  
       2022-03-27 01:05:16 +08:00   ❤️ 1
    @placeholder

    网上很多这样的网民,自己站在道德高点,抨击别人,满足自己的”道德欲望“。。。

    如果真的让他像雷锋一样无私奉献,他会干么?
    siteshen
        35
    siteshen  
       2022-03-27 14:46:28 +08:00   ❤️ 1
    #2 @pianjiao 有点儿复杂,不过还是写出来了。

    var getAttr = function (obj, paths) {
    let value = obj;
    for (let i = 0; i < paths.length; i++) {
    value = value[paths[i]];
    }
    return value;
    };

    var rebuild = function (dict, paths) {
    // key: email, qq
    const pairs = Object.keys(dict).map((key) => {
    const obj = getAttr(dict[key], paths);
    return [key, obj];
    });
    console.log("----", pairs);

    return pairs.reduce((merged, prev) => {
    // prev: ['email', {'rule', 'isShow', extends}]
    // merged: ['rule', {'email', 'qq'}]

    console.log("--- prev", prev);
    Object.entries(prev[1]).forEach(([k, v]) => {
    merged[k] = merged[k] || {};
    merged[k][prev[0]] = v;
    });
    return merged;
    }, {});
    };

    // TESTING:
    getAttr(list, ["email", "a", "big", "isShow"]); // true
    rebuild(list, ["a", "big"]);
    // {
    // rule: {
    // email: ["abig"],
    // qq: ["abigqq"],
    // },
    // isShow: {
    // email: true,
    // qq: true,
    // },
    // extends: {
    // email: [],
    // qq: [],
    // },
    //
    460881773
        36
    460881773  
       2022-03-28 09:15:52 +08:00
    卷起来了。
    Unicorns96
        37
    Unicorns96  
       2022-03-28 10:25:45 +08:00   ❤️ 1
    /**
    * 菜鸡后端试着写一下
    * */
    function test(list, field1, field2) {
    let result = {};
    Object.keys(list).forEach(key => {
    let current = list[key][field1][field2];
    Object.keys(current).forEach(innerKey => {
    if (!result[innerKey]) {
    result[innerKey] = {};
    }
    result[innerKey][key] = current[innerKey];
    })
    })
    return result;
    }
    Unicorns96
        38
    Unicorns96  
       2022-03-28 10:57:30 +08:00
    不要听楼上一些人的,作为一个成熟的前端,应该学会自己处理一些简单的数据了,别啥都交给后端
    dany813
        39
    dany813  
       2022-03-28 13:08:21 +08:00   ❤️ 1
    建议 楼主多学习下 lodash ,做数据处理很有用
    Zink99
        40
    Zink99  
       2022-03-28 13:23:46 +08:00   ❤️ 1


    只测试了你给的数据,没问题,看不懂的话问我。
    Zink99
        41
    Zink99  
       2022-03-28 13:42:01 +08:00
    说一个看法,类似帖子见过很多次了,回复确实也是一大堆批评的,我很疑惑程序员的开源精神呢?哪怕你觉得这个问题很简单你看不上,你关掉就好了,没必要嘲讽吧?

    之前在 discord python server 上见过几个程序员教小白用 git ,教他配开发环境,个人觉得真的很棒。
    xiamy1314
        42
    xiamy1314  
       2022-03-28 14:02:50 +08:00
    众筹工资。
    pianjiao
        43
    pianjiao  
    OP
       2022-03-28 15:41:21 +08:00
    @siteshen 感谢
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1466 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 39ms · UTC 17:30 · PVG 01:30 · LAX 09:30 · JFK 12:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.