递归 JSON.stringify 实现

2024-01-11

我正在尝试学习 Javascript 中的递归,所以我想我应该重写本机JSON.stringify使用递归函数作为对自己的挑战。我几乎让我的代码可以工作:

var my_stringify = function(obj){        
  value = obj[ Object.keys(obj)[0] ];
  index = Object.keys(obj)[0];

  delete obj[ Object.keys(obj)[0] ];

  // The value is just a simple string, not a nested object
  if (typeof value === 'string'){
    if (Object.keys(obj).length !== 0){
      // Continue recursion ..
      return '"' + index + '":"' + value + '",' + my_stringify(obj);
    }

    // This would be the base case with a string at the end. Stop recursion.
    return '"' + index + '":"' + value + '"}';
  }
  // The value is actually a nested object
  else{     
    if (Object.keys(obj).length !== 0){
    // Continue recursion ..
      return '"' + index + '":{' + my_stringify(value) + ',' + my_stringify(obj);
    }
    // This is the base case with a nested object at the end. Stringify it and end recursion.
    return '"' + index + '":{' + my_stringify(value) + '}';  
  }
}

除了第一个事实之外{我的答案中缺少,我不知道如何修复这个错误。

E.g. my_stringify({foo: 'bar'})回报"foo":"bar"}代替{"foo":"bar"}.

另外,我知道我完全破坏了原始对象,有什么方法可以将原始对象的简化版本发送到递归而不删除任何内容(例如obj.slice(1))?

任何建议将不胜感激!


老问题的新答案

这里有一些非常糟糕的答案,即使在最简单的例子下也失败了。这个答案旨在详尽地回答这个问题,并演示即使在处理各种数据类型时,这样的方法也如何扩展......

极端情况

该函数对非空数据进行简单的案例分析constructor属性并进行相应编码。它设法涵盖了许多您不太可能考虑的极端情况,例如

  • JSON.stringify(undefined)回报undefined
  • JSON.stringify(null)回报'null'
  • JSON.stringify(true)回报'true'
  • JSON.stringify([1,2,undefined,4])回报'[1,2,null,4]'
  • JSON.stringify({a: undefined, b: 2})回报'{ "b": 2 }'
  • JSON.stringify({[undefined]: 1})回报'{ "undefined": 1 }'
  • JSON.stringify({a: /foo/})回报{ "a": {} }

所以为了验证我们的stringifyJSON函数实际上工作正常,我不打算直接测试它的输出。相反,我要写一点test方法,确保JSON.parse我们编码的 JSON 实际上返回了我们的原始输入值

// we really only care that JSON.parse can work with our result
// the output value should match the input value
// if it doesn't, we did something wrong in our stringifier
const test = data => {
  return console.log(JSON.parse(stringifyJSON(data)))
}

test([1,2,3])     // should return [1,2,3]
test({a:[1,2,3]}) // should return {a:[1,2,3]}

免责声明:很明显我要分享的代码是并不意味着用作实际替代品 for JSON.stringify– 有无数的极端情况我们可能没有解决。相反,共享此代码是为了演示我们如何完成此类任务。可以轻松地将其他极端情况添加到此函数中。


可运行的演示

话不多说,这里是stringifyJSON在可运行的演示中验证了几种常见情况的出色兼容性

const stringifyJSON = data => {
  if (data === undefined)
    return undefined
  else if (data === null)
    return 'null'
  else if (data.constructor === String)
    return '"' + data.replace(/"/g, '\\"') + '"'
  else if (data.constructor === Number)
    return String(data)
  else if (data.constructor === Boolean)
    return data ? 'true' : 'false'
  else if (data.constructor === Array)
    return '[ ' + data.reduce((acc, v) => {
      if (v === undefined)
        return [...acc, 'null']
      else
        return [...acc, stringifyJSON(v)]
    }, []).join(', ') + ' ]'
  else if (data.constructor === Object)
    return '{ ' + Object.keys(data).reduce((acc, k) => {
      if (data[k] === undefined)
        return acc
      else
        return [...acc, stringifyJSON(k) + ':' + stringifyJSON(data[k])]
    }, []).join(', ') + ' }'
  else
    return '{}'
}

// round-trip test and log to console
const test = data => {
  return console.log(JSON.parse(stringifyJSON(data)))
}

test(null)                               // null
test('he said "hello"')                  // 'he said "hello"'
test(5)                                  // 5
test([1,2,true,false])                   // [ 1, 2, true, false ]
test({a:1, b:2})                         // { a: 1, b: 2 }
test([{a:1},{b:2},{c:3}])                // [ { a: 1 }, { b: 2 }, { c: 3 } ]
test({a:[1,2,3], c:[4,5,6]})             // { a: [ 1, 2, 3 ], c: [ 4, 5, 6 ] }
test({a:undefined, b:2})                 // { b: 2 }
test({[undefined]: 1})                   // { undefined: 1 }
test([[["test","mike",4,["jake"]],3,4]]) // [ [ [ 'test', 'mike', 4, [ 'jake' ] ], 3, 4 ] ]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

递归 JSON.stringify 实现 的相关文章

  • 关闭选项卡时要求确认[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 当我在某些浏览器上关闭页面时 我希望出现一个消息框 并询问我是否真的要关闭页面 有两个按钮 如果我单击No那么这个标签就不会被关闭 我怎样
  • 了解设置 JQuery 变量

    了解设置 JQuery 变量 最近 我通过在 StackOverflow 上遇到的另一个问题寻找帮助 了解到如何设置 JQuery 变量 如下所示 您可以通过简单地调用变量来创建输入字段 并且锚变量似乎也定义了样式 var clicked
  • 每 3 秒重复一次动画

    我正在使用 WOW js 和 animate css 现在我正在将 CSS 运行到 Infinite 我想知道如何让我的课程运行 3 秒停止并再次开始到无限 My html img src images fork png class for
  • 不和谐机器人 |不和谐.js |类型错误:无法读取未定义的属性“长度”

    我正在制作一个 Discord 机器人 并且正在使用 CodeLyon 的视频作为参考 该错误位于我的 message js 文件中 该文件包含以下内容 require dotenv config create cooldowns map
  • 尝试将布尔 C# 变量传递给 javascript 变量并将其设置为 true

    在我的 aspx 页面中 我将布尔变量 C 传递给需要布尔类型的 javascript 函数 但遇到了问题 但是 C 变量返回 True 而 javascript 不喜欢大写 myjavascript 如果我将 c 变量转换为字符串 那么我
  • 在 Ada 中使用递归绘制保龄球瓶(金字塔)

    我知道这是通过展示我最不复杂的作品来推动社区的善意 期待有人来拯救我 但我别无选择 没有什么可失去的 过去几周我已经浏览了数据包 文件 类型 标志和框 但没有涉及太多递归 特别是不要用递归来绘图 我的考试大约还有一周时间 我希望有足够的时间
  • 解析“流”JSON

    我在浏览器中有一个网格 我想通过 JSON 将数据行发送到网格 但浏览器应该在接收到 JSON 时不断解析它 并在解析时将行添加到网格中 换句话说 在接收到整个 JSON 对象后 不应将行全部添加到网格中 应该在接收到行时将其添加到网格中
  • 使用 jQuery/JS 打开时使
    标签的内容具有动画效果

    我只想要 HTML5 的内容details标记为 滑行 动画打开 而不是仅仅弹出打开 立即出现 这可以用 jQuery Javascript 实现吗 Fiddle http jsfiddle net 9h4Hq HTML
  • 检查 JavaScript 字符串是否为 URL

    JavaScript 有没有办法检查字符串是否是 URL 正则表达式被排除在外 因为 URL 很可能是这样写的stackoverflow 也就是说它可能没有 com www or http 如果你想检查一个字符串是否是有效的 HTTP UR
  • Google App Engine:修改云运行环境

    我正在尝试部署一个使用自定义 Node js 服务器的 Next js 应用程序 我想将自定义构建变量注入应用程序 next config js const NODE ENV process env NODE ENV const envTy
  • 如何监听 jQuery AJAX 请求?

    以下两种实现 ajaxRequest 1 2 的方法应该是等效的 话说回来 为什么验证回调已执行的单元测试 3 在 1 中成功而在 2 中失败 我应该如何重写测试 3 来监视 2 中的成功回调 如果我尝试stub jQuery ajax使用
  • JavaScript 重定向到新窗口

    我有以下代码 它根据下拉列表的值重定向到页面 我如何使其在新窗口中打开 function goto form var index form select selectedIndex if form select options index
  • 音频 blob 的 URL.createObjectURL 在 Firefox 中给出 TypeError

    我正在尝试从创建的音频 blob 创建对象 URLgetUserMedia 该代码在 Chrome 中可以运行 但在 Firefox 中存在问题 错误 当我打电话时stopAudioRecorder 它停在audio player src
  • 使用 KnockoutJs 映射插件进行递归模板化

    我正在尝试使用以下方法在树上进行递归模板化ko映射 插入 http knockoutjs com documentation plugins mapping html 但我无法渲染它 除非我定义separate每个级别的模板 在以下情况下
  • 提交表单并重定向页面

    我在 SO 上看到了很多与此相关的其他问题 但没有一个对我有用 我正在尝试提交POST表单 然后将用户重定向到另一个页面 但我无法同时实现这两种情况 我可以获取重定向或帖子 但不能同时获取两者 这是我现在所拥有的
  • Angular 2+ 安全性;保护服务器上的延迟加载模块

    我有一个 Angular 2 应用程序 用户可以在其中输入个人数据 该数据在应用程序的另一部分进行分析 该部分仅适用于具有特定权限的人员 问题是我们不想让未经授权的人知道how我们正在分析这些数据 因此 如果他们能够在应用程序中查看模板 那
  • 模块构建失败(来自 ./node_modules/babel-loader/lib/index.js)Vue Js

    我从 GitHub 下载了一个我和我的朋友正在开发的项目 但是当我尝试运行时 npm run serve 我收到这个错误 src main js 中的错误 Module build failed from node modules babe
  • Javascript 纪元时间(以天为单位)

    我需要以天为单位的纪元时间 迄今为止 我已经看到过有关如何翻译它的帖子 但几天后就没有了 我对纪元时间很不好 我怎么能得到这个 我需要以天为单位的纪元时间 我将解释为您想要自纪元以来的天数 纪元本身是第 0 天 或第 1 天的开始 无论您如
  • 如何更改此 jquery 插件的时区/时间戳?

    我正在使用这个名为 timeago 的插件 在这里找到 timeago yarp com 它工作得很好 只是它在似乎不同的时区运行 我住在美国东部 费城时区 当我将准确的 EST 时间放入 timeago 插件时 比如 2011 05 28
  • 在 React.js 中编辑丰富的数据结构

    我正在尝试为数据结构创建一个简单的基于网格的编辑器 但我在使用 React js 时遇到了一些概念问题 他们的文档对此没有太大帮助 所以我希望这里有人可以提供帮助 首先 将状态从外部组件传输到内部组件的正确方法是什么 是否有可能将内部组件中

随机推荐

  • 为什么Java认为从10到99所有数字的乘积都是0?

    以下代码块的输出为 0 public class HelloWorld public static void main String args int product 1 for int i 10 i lt 99 i product i S
  • AS3 Blitting - 复制像素获取一些源图像

    我试图在屏幕上绘制一些内容 然后将其复制到舞台上的位图上 我以前已经这样做过 用程序绘制的形状如圆形 但当我使用库项目时 大多数源像素都会被切断 这是我的代码 在另一个函数中 位图对象被添加到舞台上 我可以看到 copyPixels 工作
  • TFS Git - 拉取请求“合并失败”

    您好 我在 TFS 和 git pull requests 方面遇到了这个问题 我们有两个主要分支 掌握 发展 所以我创建新分支 async data loadingdevelop并对其进行一些更改 接下来 我提交更改并将其推送到远程 as
  • 当div高度未设置时,如何让html表格高度=父div的高度

    我有一个 html 表 位于 div 内 div 的高度基于 div 中的其他元素 如何让表格的高度等于其父 div 的高度 表格高度 100 不起作用 因为未设置div的高度 Update 我需要支持 IE6 7 8 因此这些浏览器应该能
  • ios core data如何实现sql事务功能?

    就像标题一样 我使用核心数据来插入项目 我插入了100个项目 它太慢了 如何提高插入速度 Core Data有哪些交易功能 lt NSManagedObjectContext gt undoManager beginUndoGrouping
  • 如何在 Django 模板中使用域 get_absolute_url ?

    所以我有点挣扎 一些逻辑上看起来很简单的东西 但由于我对 Django 的理解有限 我不确定在哪里寻找以及如何制定解决方案 基本上我设置了一个博客应用程序 它在主页上显示完整的 所有内容 包括 disqus 讨论 最新帖子 该帖子还有一个指
  • 检测objective-c中for()循环的真正结束

    我将在我的应用程序中显示一种 UIActivityIndi catorView 同时在 for 循环内解析多个 JSON 对象 我不知道必须在哪里放置 UIActivityIndi catorView startAnimating 和 UI
  • keyof T 的默认类型不能用于索引类型 T

    我正在尝试重构此代码以使用静态方法 因为该类仅用于命名空间和Query equal
  • 检查包含任意顺序的 3 个连续字母和 2 个数字的字符串

    我似乎无法理解这个问题 我想我应该在这里寻求一些帮助 基本上我正在验证密码字段 要求如下 必须包含3个连续字母 必须包含至少 2 位数字 可以是任何顺序 例如 1abc342 abc24g3 11abcsjf 这是我到目前为止所拥有的 但我
  • WebSphere MQ 确认和回复队列

    我们通过远程队列定义 CLIENT DATA 传输队列 发送 接收通道等 从队列管理器 QM MINE 队列管理器 QM CLIENT 和队列 CLIENT DATA 发送 XML 文本消息 消息到达目的地 客户端的 CLIENT DATA
  • 通过比较另一个图像的强度来更改图像的强度 - OpenTK

    我有两个图像 我必须找到第一张图像中强度大于 0 8 的点 同时 我必须找到第二张图像在相同点上的强度 并且需要使用阈值 滑块值 范围从 0 到 1 调整第二张图像在相同点上的光线 我已经做了如下 点上出现黑色或深色区域的强度大于 0 8
  • 将 csv 文件的前 x 行读取到新的输出文件中?

    如何只复制 a 的前 x 行csv文件到一个新的csv通过终端文件 Brief 您将使用 Linux 终端 控制台 Use head n NUMBEROFLINES file csv获得第一NUMBEROFLINES的线路 使用 shell
  • 选择具有特定值的行之后的行

    嘿 再次 我仍然掌握查询和其他东西 所以请原谅所有常见的 SQL 问题 8 无论如何 我试图选择某个值之后的行 不明白 好吧 这就是它实际的样子 表 消息 message id thread id user id to id body me
  • 跨浏览器剪贴蒙版

    我的网站有导航 以矩形按钮列表的形式呈现有圆角 每个按钮都应该有自己的自定义背景 即照片 照片比按钮大 并且应该随着鼠标在该按钮上的移动而移动 我们有一种效果 就像我们透过窗户看一样 导航具有以下 HTML 结构 ul gt li gt a
  • Android CalendarProvider 事件颜色

    我最困惑的是如何在 Android CalendarProvider 中使用颜色 我可以添加事件 但是当我尝试插入具有特定颜色的事件时 默认日历颜色 浅蓝色 似乎会忽略此首选项 我想我不太确定如何使用颜色 我想知道是否有人可以好心地解释一下
  • 延迟容器启动,直到 pod 中的其他容器启动

    我正在研究一个用例 其中 sidecar 容器在更改主容器的目录权限时连续运行 shell 脚本 我只想在 pod 中的主容器准备就绪后才启动侧容器 我正在查看 Init Containers 我发现当我们具有 pod 间依赖关系时 ini
  • JavaScript 中的 Node js / MongoDB 副本集数组

    警告 我是一名新手程序员 更多的是系统管理员 我们获得了一个使用 MongoDB 的 Node js 应用程序 据我所知 mongo js 文件使用 mongojs 和 monq java 类 它只设置了一个 MongoDB 我正在尝试设置
  • Flask AttributeError:模块“flask.json”没有属性“JSONEncoder”

    我的烧瓶应用程序在升级之前可以正常运行 当忘记重置密码时 我在发送电子邮件时遇到了问题 为了尝试解决这个问题 我最近升级了我的 Flask 应用程序的一些模块 我使用当前版本升级的模块是 电子邮件验证器 2 0 0 post2 烧瓶 2 3
  • 如何在C#中动态创建表

    table border 1 tr td Record 1 td tr tr td 1 td td 2 td td 3 td tr tr td a td td b td td c td tr tr td m td td n td td o
  • 递归 JSON.stringify 实现

    我正在尝试学习 Javascript 中的递归 所以我想我应该重写本机JSON stringify使用递归函数作为对自己的挑战 我几乎让我的代码可以工作 var my stringify function obj value obj Obj