最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 实现react的classnames | 刷题打卡

    正文概述 掘金(Djmughal)   2021-03-07   650

    题目描述

    实现 react 的 classname 题目链接:BFE.dev 题干如下: 实现react的classnames | 刷题打卡

    思路分析

    把参数转化成空格连接的字符串,参数类型除 null, undefined, Symbol(), 1n, true, false 以外,例如题干中的:

    const obj = new Map();
    obj.cool = '!';
    
    expect(classnames('BFE', 'DEV', 100)).toEqual('BFE DEV 100');
    expect(classNames({ BFE: [], dev: true, is: 3 }, obj)).toEqual('BFE DEV is cool');
    expect(classNames(['BFE', [{dev: true}, ['is', [obj]]]])).toEqual('BFE DEV is cool');
    
    • 把入参拍平,希望拍平后的参数 => ('BFE', 100, {name: 'xxx'}, {name: 'xxx', age: 18})
    • 处理参数并添加到新队列 string & number 类型直接添加,object 类型添加值

    AC代码

    function classNames(...args) {
        // your code here
        args = flatten(args);
        return args.reduce((memo, arg) => {
            if (typeof arg === 'string' || typeof arg === 'number') {
                memo.push(arg);
            } else if (typeof arg === 'object') {
                const result = Object.keys(arg).reduce((arr, key) => {
                    if (!!arg[key]) {
                        arr.push(key);
                    }
                    return arr;
                }, []);
                memo.push(...result);
            }
            return memo;
        }, []).join(' ');
    }
    
    function flatten(args) {
      return args.reduce((memo, arg) => {
        if (arg instanceof Array) {
          memo.push(...arg.flat(Infinity));
        }
        else {
          memo.push(arg);
        }
    
        return memo;
      }, []);
    }
    

    总结

    写完之后,我去看了下 classnames 源码,区别在于 flatten 合并在了 parse 阶段递归运算再把结果添加到新队列:

    if (Array.isArray(arg)) {
      if(arg.length) {
          var inner = classNames.apply(null, arg);
          if (inner) {
              classes.push(inner);
          }
      }
    }
    

    周末加班之余写的,后面会挑一点有难度的题~
    本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情


    起源地下载网 » 实现react的classnames | 刷题打卡

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元