前端面试题

一、CSS 自适应布局

已知:

  • 布局分为:父元素A和N个子元素B;
  • A宽度不固定:最小宽度为1000px,内部边距是32px
  • B的宽度不固定:相邻两个B元素的间距是16px,所有B的宽度相同,边框为1像素,颜色为999
  • 每行只能有3个B元素,超过的话需要换行;
  • 最左侧B元素和最右侧的B元素,距离A的边缘都是32px;

HTML
<div class="client-a">
   <div class="client-b"></div>
   <div class="client-b"></div>
   <div class="client-b"></div>
   <div class="client-b"></div>
   <div class="client-b"></div>
</div>

<style>
.client-a{
            min-width: 1000px;
            padding: 24px;
            display: flex;
            border: 1px solid #333;
            flex-wrap: wrap;
            justify-content: space-evenly;
        }
        .client-b{
            flex: 1 0 30%;
            box-sizing: border-box;
            margin:8px;
            border: 1px solid #999;    }
</style>

二、给定一个以数字组成的数组,实现输出id为数字,并且从小到大排序的name(请使用es6语法)

JavaScript
// 调用示例
const source = [
    { id: 4, name: 'test1' },
    { id: {}, name: 'ssdf' },
    "test",
    { id: () => {}, name: 'sf' },
    { id: '6', name: 'test3' },
    { id: 6, name: 'test4' },
    { id: 7, name: 'test7' },
    { id: 2, name: 'test2' },
    { name: 'sf' },
    {},
]
 

 function filterSort(arr) {
        // 写下你的代码    
        var list = arr.filter(value => {
            return (typeof value.id) == (typeof 1)
        })
        list.sort(function (a, b) {
            return a.id - b.id;
        })
        var lists = []
        list.forEach(value => {
            lists.push(value.name)
        })
        return lists
    }
    console.log(filterSort(source));

三、请求后端接口,按要求获取数据

现有一个 POST 接口:https://xxx.com/students,每次请求只能返回 10 个学生的课程成绩 如下

该接口有一定概率请求失败 不可忽略:Response Status Code 500,Body 为空

要求:

实现一个函数,总共需获得 100 个成绩大于 90 分,且时间在2021年12月3日之后的学生的课程成绩,并按各自成绩从大到小排列返回。(可直接使用 fetch 或 axios)

提示:

  • 浏览器最多可以有 6 个并行的网络请求
  • 尽可能在更短的时间内,运行完成得到结果
  • 尽可能用最少的请求次数
async function fetchStudents(){

    // 实现相应逻辑
const source = axios.CancelToken.source();
const query = function query() {
    return axios.post('https://xxx.com/students', null, { cancelToken: source.token })
        .then(response => response.data);
};
const fetchStudents = function fetchStudents() {
    return new Promise(resolve => {
        // 创建6个工作区同时进行
        let works = new Array(6).fill(null),
            values = [],
            flag = false;
        works.forEach(() => {
            // 每个工作区都是获取学生信息;当此任务执行完(不论成功还是失败),继续去获取学生信息..
            const next = async () => {
                if (flag) return;
                // 当values存储的结果够100个后,就无需再发请求(取消正在发送的请求)
                if (values.length >= 100) {
                    resolve(values.slice(0, 100));
                    source.cancel();
                    flag = true;
                    return;
                }
                try {
                    let value = await query();
                    value = value.filter(item => {
                        return item.score >= 90 && (new Date(item.time) - new Date('2021-12-03')) > 0;
                    });
                    values = values.concat(value);
                } catch (_) { }
                next();
            };
            next();
        });
    });
};

}

let i=0;
let list=[],
function rightTime(time){
	// 时间大于12月03日的时间返回true
}
async function fetchStudents(){
    // 实现相应逻辑
    let res = awiat axios.post(url,data:{pageNum:i+1})
    list =list.cancat(...res.data.filter(item=>{
    	return item.score>90&& rightTime(item.time)
    }))
	if(list.length>=100){
		return list
	}else{
		return fetchStudents()
	}

 对象转url格式

    // http://www.baidu.com/?a=1&name=join
    function fn(obj) {
        const params = []
        //  Object.keys() 遍历对象的属性名返回一个数组
        Object.keys(obj).forEach(key => {
            let val = obj[key]//取出属性值
            params.push([key, val].join('=')) //用等号拼接  
        })
        return params.join("&")//用&分割
    }
    let = obj = {
        a: 1,
        name: 'join'
    }
    console.log(fn(obj));

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值