您的位置:首页 > Web前端

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

2020-09-09 15:27 861 查看
现在有一个json, 在某一维度中可能出现'score'键, 请使用任意语言写一个check方法判断该json是否满足要求. 要求如下:
a. 任意一个键为score的值预期是整型数字且大于60, 则检查通过
b. 若不存在键为score的值, 则检查通过

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

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

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

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

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

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

[code]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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: