欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

前端企业面试题:企业真实案例——27

程序员文章站 2022-06-04 14:53:18
...
现在有一个json, 在某一维度中可能出现'score'键, 请使用任意语言写一个check方法判断该json是否满足要求. 要求如下:
a. 任意一个键为score的值预期是整型数字且大于60, 则检查通过
b. 若不存在键为score的值, 则检查通过

这道题目本身的质量是不错的, 可惜出题的人语文可能不太好.

最讨厌这种看似严谨实则不会说人话的题目描述, 因为题目中一旦出现歧义, 你无法通过日常语言习惯进行判断. 题目要求a明显就是有歧义的.

我按照我的理解, 尝试把它翻译成人类能看懂的话. 内容如下:

有一个json, 对象结构可能较深.写一个check方法来遍历整个对象树, 做出如下判断:

a. 无论在树的哪一层哪一个节点, 只要出现了 score属性, 且为数字类型, 且大于60 ,则表示通过

b. 若遍历整棵树, 没找到一个score属性, 则同样表示通过

function check(target){
	let unchecklist = [target];
	let len = 1;
	let hasScore = false;
	
	for(let i=0; i<len; i++) {
		try {
			each(unchecklist[i]);
		} catch(e) {
			if(e.message == "pass") return true;
		}
	}
        //如果有score属性, 并且没有符合条件, 那么返回false
        //如果没有score属性, 也可以通过
	return !hasScore;
	
	function each(m){
		for(let attr in m) {
			if(attr=="score" && typeof m[attr] === "number") {
				hasScore = true;
                                //一旦发现了符合条件的score属性
                                //这里无法直接返回, 因此抛出异常通知上层函数
				if(m[attr] > 60) throw new Error("pass");
			} else if( typeof m[attr] === "object" ) {
                                //若属性没有符合条件, 但是个对象类型
                                //则放入待检测列表, 继续检测
				unchecklist.push(m[attr]);
                                //改变len长度, 使得上层函数循环得以继续
				len++;
			}
		}
	}
}
let jsonobj = {
	"name" : "BeJson",
	"url" : "http://www.bejson.com",
	"score" : "abc",
	"address" : {
		"score" : 63,
		"city" : "江苏苏州",
		"country" : "中国"
	},
	"links" : [{
		"score" : 50,
		"url" : "http://www.google.com"
	}]
}

check(jsonobj);  //true