如何轻松衡量 JSON 对象的复杂性?

Jun*_*awa 5 javascript json

如果我想比较一系列 API 响应的响应复杂性(作为解析和验证响应可能需要多少努力的代理),是否有任何现有的工具或库可以非常有效地做到这一点?还是一段简单的代码?

理想情况下,可以打印出一份快速报告,显示整个结构的深度和广度,以及任何其他可能有用的指标。

Ger*_*ica 3

{启发式方法是简单地计算、}[和字符的数量]。当然,这只是一个启发式的方法;在这种方法下,像 json 对象这样的结构{ value: "{[}{}][{{}{}]{}{}{}[}}{}{" }会被认为过于复杂,尽管它的结构非常简单。

let guessJsonComplexity = (json, chars='{}[]')) => {
  let count = 0;
  for (let char in json) if (chars.includes(char)) count++;
  return count / (json.length || 1);
};
Run Code Online (Sandbox Code Playgroud)

如果速度非常重要,您会选择这个答案。

如果您想要更简洁的答案,您几乎肯定需要解析 json!

我们还可以考虑另一种方法。考虑为 json 中可能发生的每种可能现象分配一个“复杂性分数”。例如:

  • s包含一个字符串;复杂度得分:Math.log(s.length)
  • n包括一个数字;复杂度得分:Math.log(n)
  • 包含一个布尔值;复杂度得分:1
  • 包含一个数组;复杂度得分:元素的平均复杂度+1
  • 包含一个对象;复杂度分数:值的平均复杂度加上键的平均复杂度+1

如果我们想认为其中一些关系比其他关系更“复杂”,我们甚至可以挑选出不同的关系,例如“数组中包含一个对象”或“数组中包含一个数组”等。例如,如果我们这么认为的话,我们可以说负数是正数的两倍“复杂”。

我们还可以考虑“深度因素”,这使得元素越深入就越重要。

如果我们定义如何对所有这些现象进行评分,我们可以编写一个处理 json 并应用这样的分数的函数:

let guessJsonComplexity = (json, chars='{}[]')) => {
  let count = 0;
  for (let char in json) if (chars.includes(char)) count++;
  return count / (json.length || 1);
};
Run Code Online (Sandbox Code Playgroud)

如果您想了解有关大型 json 对象的子对象的更多详细信息,您getComplexity也可以简单地调用这些子对象。