前端企业面试题:企业真实案例——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