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

现在有一个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

猜你喜欢

转载自blog.csdn.net/GUDUzhongliang/article/details/108490664