自编自用笔试题:给JSON.stringify的简化实现添加“环”检查算法

### 题目javascript

JSON.stringify 的功能是,将一个 javascript 字面量对象转化为一个JSON格式的字符串。例如java

const obj = {a:1, b:2}

JSON.stringify(obj) // => '{"a":1,"b":2}'

当要转化的对象有“环”存在时,为了不死循环,JSON.stringify 会抛出异常,例如:json

const obj = {
  foo: {
    name: 'foo'
  },
  bar: {
    name: 'bar'
    baz: {
      name: 'baz',
      next: null // 将指向obj.bar
    }
  }
}

obj.bar.baz.next = obj.bar

JSON.stringify(obj) // => TypeError: Converting circular structure to JSON

假设入参是字面量对象,属性名是字符串,属性值要么是数字字面量,要么是字面量对象,不考虑json排版,JSON.stringify的简化版实现以下:函数

/**
 * “环”检查器
 */
function detectorCircular(obj) {
  // 请实现
}

/**
 * JSON.stringify简化实现
 * @param obj 要转化为字符串的对象
 * @param ignoreCircular 是否忽略“环”检查
 */
function stringify(obj, ignoreCircular = false) {
  if (!ignoreCircular && detectorCircular(obj)) {
    throw new TypeError('Converting circular structure to JSON')
  }

  const keys = Object.keys(obj)
  
  if (!keys.length) {
    return '{}'
  }
  
  const content = keys.map(key => {
    const value = obj[key]
    
    if (typeof value === 'number') {
      return `"${key}":${value}`
    } else {
      return `"${key}":${stringify(value, true)}`
    }
  }).join(',')
  
  return `{${content}}`
}

请实现上述代码中的 detectorCircular 函数。code

相关文章
相关标签/搜索