首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Javascript递归函数在遍历JSON文件后返回多个结果数组,而不是包含所有对象的最终数组

递归是一种函数调用自身的编程技巧,常用于解决需要重复执行相同或类似任务的问题。在处理JSON文件时,递归函数可以用来遍历JSON对象的所有属性和子属性,从而提取所需的信息。

当递归函数遍历JSON文件时,它会检查每个属性的类型。如果属性是一个对象,函数将继续调用自身来遍历该对象的属性。如果属性是一个数组,函数将迭代数组的每个元素,并对每个元素执行相同的操作。如果属性是一个值(如字符串、数字等),函数将根据需求对其进行处理。

在每次递归调用中,函数可以将所需的结果存储在一个数组中,并在最终返回结果之前将所有子结果合并。这意味着递归函数可以返回多个结果数组,每个数组对应一个遍历过程中收集的结果集。

下面是一个示例递归函数的代码:

代码语言:txt
复制
function processJSON(json) {
  let results = [];

  // 递归函数
  function recursive(obj) {
    for (let key in obj) {
      if (typeof obj[key] === 'object') {
        recursive(obj[key]); // 继续调用自身遍历对象的属性
      } else if (Array.isArray(obj[key])) {
        for (let item of obj[key]) {
          recursive(item); // 对数组的每个元素调用自身
        }
      } else {
        // 处理值的逻辑
        // ...

        // 将结果添加到数组
        results.push(obj[key]);
      }
    }
  }

  recursive(json); // 调用递归函数开始遍历JSON

  return results;
}

在这个例子中,processJSON函数接收一个JSON对象作为参数,并返回一个包含遍历结果的数组。该函数内部定义了一个递归函数recursive,它负责遍历JSON对象并处理每个属性的值。

在递归函数中,使用for...in循环遍历对象的属性。如果属性的类型是对象,则递归调用recursive函数继续遍历该对象。如果属性的类型是数组,则使用for...of循环迭代数组的每个元素,并对每个元素调用recursive函数。如果属性是一个值,则根据需求进行处理,并将结果添加到results数组中。

最后,调用递归函数recursive(json)开始遍历JSON对象,并返回结果数组。

关于递归函数和JSON的更多详细信息,可以参考以下资源:

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

JavascriptJSON

JSON两种结构 对象结构 JSON对象保存在大括号中。可以存在多个关键字/值对。 其中关键字是字符串,值可以是字符串、数值、true、false、null、对象数组。...图片 遍历属性 for-in循环对象属性时,使用中括号来访问属性值。...语法 var obj = JSON.parse(str[, reviver]); str为必须,一个有效JSON字符串。 reviver 可选,一个转换结果函数, 将为对象每个成员调用此函数。...replacer为可选,用于转换结果函数数组。 如果replacer为函数,则JSON.stringify将调用该函数,并传入每个成员键和值。使用返回不是原始值。...如果此函数返回 undefined,则排除成员 如果replacer是一个数组,会遍历数组值,以数组值作为value属性。如果value原本包含该属性,那么显示该属性,如果不包含则不显示。

1.1K30

【Webpack】632- 了不起 Webpack 构建流程学习

当 Webpack 处理应用程序时,它会递归地构建一个依赖关系图(dependency graph),其中包含应用程序需要每个模块,然后将所有模块打包成一个或多个 bundle。...(5)完成模块编译并输出 递归,得到每个文件结果包含每个模块以及他们之间依赖关系,根据 entry 配置生成代码块 chunk 。 (6)输出完成 输出所有的 chunk 到文件系统。...函数调用参数,递归遍历所有子节点文件,并将结果都保存在依赖图谱 queue 中。...image.png 这个依赖图谱,包含所有文件模块依赖,以及模块代码内容。下一步只要实现 bundle() 函数,将结果输出即可。 4.... bundle() 函数中,接收一个依赖图谱 graph 作为参数,最后输出编译结果

1K20
  • 2022我前端面试总结

    :1111 window对象1111 obj对象window对象解析:o(),o是全局执行f1是箭头函数,它是没有绑定this,它this指向其父级this,其父级say方法this指向是全局作用域...因为display属性为none元素上进行DOM操作不会引发回流和重绘。将DOM多个读操作(或者写操作)放在一起,不是读写操作穿插着写。这得益于浏览器渲染队列机制。...如果函数返回一个对象,那么new 这个函数调用返回这个函数返回对象,否则返回 new 创建对象组件之间传值有几种方式1、父传子2、子传父3、eventbus4、ref/$refs5、$parent...[i] = obj[i]; } return cloneObj;}深克隆:考虑基础类型引用类型RegExp、Date、函数 不是 JSON 安全会丢失 constructor,所有的构造函数都指向...由于 split 分割形成数组每一项值为字符串,所以需要用一个map方法遍历数组将其每一项转换为数值型。

    1.1K30

    记一次京东前端面试被问到题目

    (debounce)防抖函数原理:事件被触发n秒再执行回调,如果在这n秒内又被触发,则重新计时。...注意:如果目标对象和源对象有同名属性,或者多个对象有同名属性,则后面的属性会覆盖前面的属性。如果该函数只有一个参数,当参数为对象时,直接返回对象;当参数不是对象时,会先将参数转为对象然后返回。...[Prototype](也就是proto)链接它使this指向新创建对象通过new创建每个对象最终被[Prototype]链接到这个函数prototype对象上如果函数没有返回对象类型Object...(json); // 把文件结果放在exports属性上 }}// tryModuleLoad函数接收是模块对象,通过path.extname来获取模块后缀名,然后使用Module....每个普通函数都是Function实例,箭头函数不是任何类实例,每次调用都是不一样引用。那我们只需要处理普通函数情况,箭头函数直接返回它本身就好了。那么如何来区分两者呢?答案是: 利用原型。

    41640

    递归递归之书:引言到第四章

    输入 JavaScript 程序代码,将文件保存为*.html文件不是.js*文件 Web 浏览器中打开它们以查看结果。任何现代 Web 浏览器都可以用于此目的。 一、什么是递归?...如果您需要在程序中三个不同位置运行相同指令,不是将源代码复制粘贴三次,您可以函数中编写一次代码并调用函数三次。有益结果是更短和更易读程序。...为c()调用创建一个新对象并将其放置调用堆栈上,其中包含c()局部spam变量 ❻。随着这些函数返回,帧对象从调用堆栈中弹出。程序执行知道要返回到哪里,因为返回信息存储对象中。...图 2-1 跟踪了调用栈状态,帧对象被推送(当递归函数调用时发生)和帧对象被弹出(当递归函数调用返回时)。注意乘法发生在递归调用之后,不是之前。...sum()函数返回值也是一个单一数字值,不是一个数字数组;这就是为什么我们可以递归情况中将head和sum(tail)相加❹。

    63810

    JavaScript 对象入门使用JSON

    JSON 要求有两头 { } 来使其合法。最安全写法是有两边括号,不是一边。 甚至一个错位逗号或分号就可以导致 JSON 文件出错。...使用 reviver 函数 如果指定了 reviver 函数,则解析出 JavaScript 值(解析值)会经过一次转换才将被最终返回返回值)。...更具体点讲就是:解析值本身以及它所包含所有属性,会按照一定顺序(从最最里层属性开始,一级级往外,最终到达顶层,也就是解析值本身)分别的去调用 reviver 函数调用过程中,当前属性所属对象会作为...replacer 可选 如果该参数是一个函数,则在序列化过程中,被序列化每个属性都会经过该函数转换和处理;如果该参数是一个数组,则只有包含在这个数组属性名才会被序列化到最终 JSON 字符串中...使用 JSON.stringify 结合 localStorage 例子 一些时候,你想存储用户创建一个对象,并且,即使浏览器被关闭仍能恢复该对象

    1.5K10

    js深拷贝和浅拷贝具体使用区别_es6深拷贝和浅拷贝

    首先了解一些javascript基本知识。 【1】javascript变量包含两种不同数据类型值:基本类型和引用类型。...与其他语言不同,JavaScript 不允许直接访问内存中位置,也就是说不能直接操作对象内存空间。 操作对象时, 实际上是操作对象引用不是实际对象。...,如果对象内还有对象,则只能复制嵌套对象地址,无法进行深层次拷贝,当改变obj2嵌套对象c,obj1嵌套对象c值也跟着变了 这个时候我们可以使用深拷贝来完成,所谓深拷贝,就是能够实现真正意义上数组对象拷贝...数组浅拷贝 如果是数组,我们可以利用数组一些方法比如:slice、concat 返回一个新数组特性来实现拷贝。...(newArr); // {a: "one"} // 函数没有复制成功复制代码 对象浅拷贝 Object.assign()方法可以把任意多个对象自身可枚举属性拷贝给目标对象,然后返回目标对象

    64720

    一篇文章彻底搞懂浅拷贝和深拷贝区别_深拷贝和浅拷贝

    我们希望改变新数组对象时候,不改变原数组对象) 深拷贝要求程度 我们使用深拷贝时候,一定要弄清楚我们对深拷贝要求程度:是仅“深”拷贝第一层级对象属性或数组元素,还是递归拷贝所有层级对象属性和数组元素...() 方法用于将一个 JSON 字符串转换为对象–(反序列化) JSON.stringify() 方法是将一个JavaScript值(对象或者数组)转换为一个 JSON字符串–(序列化) 序列化缺点:...不支持基本数据类型undefined,序列化将其省略 不支持函数 Nan,Infinity序列化结果是null 能用大招杀就不要用q杀嘛!!...for… in特点 遍历对象返回对象key值,遍历数组返回数组下标(key)。...for… of特点 for of遍历只是数组元素,不包括数组原型属性method和索引name for … in 会遍历原型上属性值 遍历返回数据是乱序 for of 不同与

    47110

    来自大厂 10+ 前端面试题附答案(整理版)

    如果纯用 Vue,体积还会更小巧图片垃圾回收对于JavaScript字符串,对象数组是没有固定大小,只有当对他们进行动态分配存储时,解释器就会分配内存来存储这些数据,当JavaScript解释器消耗完系统中所有可用内存时...域名分片顾名思义,我们可以一个域名下分出多个二级域名出来,它们最终指向还是同一个服务器,这样子的话就可以并发处理任务队列更多,也更好解决了队头阻塞问题。...源代码经过webpack处理之后最终产物。loader:模块转换器。本质就是一个函数函数中对接收到内容进行转换,返回转换结果。...每一个入口点都是一个块组(chunk group),不考虑分包情况下,一个 chunk group 中只有一个 chunk,该 chunk 包含递归分析所有模块。...完成模块编译:经过第 4 步使用 loader 翻译完所有模块,得到了每个模块被翻译最终内容以及它们之间依赖关系。

    84060

    前端常考手写面试题汇总

    a 是否被包含在字符串 b 中,并返回第一次出现位置(找不到返回 -1)。...也就是我调用很多次,他们结果会存在add函数sum变量上,当我alert时候 add会自动调用 toString方法 打印出 sum, 也就是最终结果 验证是否是邮箱 function isEmail...完成,调用其 resolve 变更状态,在这个 resolve 里会依次调用 callbacks 里回调,这样就执行了 then 里方法了 启:上一步中,当 then 里方法执行完成返回一个结果...); 局限性: 他无法实现对函数 、RegExp等特殊对象克隆 会抛弃对象constructor,所有的构造函数会指向Object 对象有循环引用,会报错 面试版: /** * deep clone...(json); // 把文件结果放在exports属性上 } } // tryModuleLoad函数接收是模块对象,通过path.extname来获取模块后缀名,然后使用Module.

    50620

    JSON神器之jq使用指南指北

    --nul-output/ -0: 像-r,但 jq 将在每次输出打印 NUL 不是换行符。当输出值可以包含换行符时,这可能很有用。...[index]语法,但完全省略索引,它将返回数组所有元素。.[]使用输入运行[1,2,3]将产生三个单独结果不是单个数组。 您也可以在对象上使用它,它将返回对象所有值。 .[]?...数组构造:[] JSON 中,[]用于构造数组,如在 [1,2,3]. 数组元素可以是任何 jq 表达式,包括管道。所有表达式产生所有结果都收集到一个大数组中。...如果输入已排序并包含 x,则 bsearch(x) 将返回其在数组索引;否则,如果数组已排序,它将返回 (-1 - ix),其中 ix 是一个插入点,因此将 x 插入到 ix ,该数组仍将被排序...流式操作 使用--stream选项 jq 可以以流方式解析输入文本,允许 jq 程序立即开始处理大型 JSON 文本,不是解析完成

    28.5K30

    【JS】547- 200行JS代码,带你实现代码编译器(人人都能学会)

    上述流程看完可能一脸懵逼,不过没事,请保持头脑清醒,先有个整个流程印象,接下来我们开始阅读代码: 3.2 入口方法 首先定义一个入口方法 compiler ,接收原始代码字符串作为参数,返回最终 JavaScript...ast return ast; } 3.4 转换阶段 转换阶段中,定义了转换器 transformer 函数,使用词法分析器返回 LISP AST 对象作为参数,将 AST 对象转换成一个新...「编译模块」 递归中根据「文件类型」和 「loader 配置」,调用所有配置 loader 对文件进行转换,再找出该模块依赖模块,再递归本步骤直到所有入口依赖文件都经过了本步骤处理。...「完成模块编译并输出」 递归完事后,得到每个文件结果包含每个模块以及他们之间依赖关系,根据 entry 配置生成代码块 chunk 。 「输出完成」 输出所有的 chunk 到文件系统。...注意:构建生命周期中有一系列插件在做合适时机做合适事情,比如 UglifyPlugin 会在 loader 转换递归完对结果使用 UglifyJs 压缩「覆盖之前结果」。

    2.6K40

    JavaScript原型链污染原理及相关CVE漏洞剖析

    0x03 原型链污染 JavaScript发展历史上,很少有真正私有属性,类所有属性都允许被公开访问和修改,包括proto,构造函数和原型。...调用split()函数对key值"__proto__.polluted" 按"."进行分割, newkeys返回key分割数组["__proto__", "polluted"]。 ?...函数定义src/core.js文件第125行。...这一段循环代码执行逻辑大致如下:按属性数组中元素顺序,依次获取对象原有的属性值,并进行赋值;如果该属性不是数组最后一个元素,那赋值为对象本身,或空数组,或{}。...如果是数组最后一个元素,就将该属性赋值为我们期望value。 POC中,第一次循环对proto属性尝试赋值,执行结果如下: ?

    3.6K20

    JS 原生方法原理探究(八):如何实现 JSON.stringify()?

    引用数据类型(按照是否可以继续遍历再分为两种): 可继续遍历类型:包括对象字面量、数组、类数组对象、Set、Map。需要丢失属性,遍历时跳过即可。...用一个函数集中进行处理 此外,遍历数组对象时候,还需要检测是否存在循环引用情况,若存在需要抛出相应错误 数据类型判断 用 getType 获取具体数据类型。...比如说 {a:"bbb"} ,我们期望序列化结果应该是 '{a:"bbb"}',不是 '{a:bbb}';同理,对于 Date 对象,直接返回 toJSON() 会得到 '{date: 1995...JSON.stringify 实现中,遍历 key 过程已经主代码完成了,所以这里 checkCircular 只需要包含检测过程。...属性丢失其实就是遍历对象时候略过这些属性 检测循环引用时候,存在嵌套关系对象应该共享同一条父级链,所以递归时候需要把存放父级链数组传进去;同时,不存在嵌套关系两个对象不应该共享同一条父级链

    1.9K50

    前端高频面试题(三)(附答案)

    1.如果obj里面有时间对象,则JSON.stringifyJSON.parse结果,时间将只是字符串形式,不是对象形式2.如果obj里有RegExp(正则表达式缩写)、Error对象,则序列化结果将只得到空对象...常见数组对象有 arguments 和 DOM 方法返回结果函数参数也可以被看作是类数组对象,因为它含有 length属性值,代表可接收参数个数。...迭代查询与递归查询实际上,DNS解析是一个包含迭代查询和递归查询过程。递归查询指的是查询请求发出,域名服务器代为向下一级域名服务器发出请求,最后向用户返回查询最终结果。...一般我们向本地 DNS 服务器发送请求方式就是递归查询,因为我们只需要发出一次请求,然后本地 DNS 服务器返回给我 们最终请求结果。...[i] = obj[i]; } return cloneObj;}深克隆:考虑基础类型引用类型RegExp、Date、函数 不是 JSON 安全会丢失 constructor,所有的构造函数都指向

    43120

    JS 原生方法原理探究(九):如何手写实现浅拷贝和深拷贝?

    obj 构造函数,用于创建一个和原对象同类型实例 这里遍历对象或者数组有三种方式,第一种是使用 Reflect.ownKeys() 获取自身所有属性(无论是否可以枚举),第二种是使用 for……in...根据初始传入 target 是一个对象字面量还是数组,决定最终返回 cloneTarget 是对象还是数组。...深拷贝过程中因为用到了递归,无限嵌套对象就会导致无限递归,不断地压栈最终会导致堆栈溢出。 如何解决循环引用带来爆栈问题呢?其实也很简单,只需要给递归创建一个出口即可。...它们都属于可以继续遍历、可能存在嵌套引用类型,因此处理时候就需要递归 不能继续遍历引用数据类型:包括函数、错误对象、日期对象、正则对象、基本类型包装对象(String、Boolean、Symbol...之前深拷贝对象字面量或者数组时候,首先会将最终返回结果 cloneTarget 初始化为 [] 或者 {}。

    1.1K31

    一个合格中级前端工程师要掌握JavaScript 技巧

    ES5 实现数组 some 方法 ? 执行 some 方法数组如果是一个空数组最终始终会返回 false,另一个数组 every 方法中数组如果是一个空数组,会始终返回 true 7....柯里化是函数式编程一个重要技巧,将使用多个参数一个函数转换成一系列使用一个参数函数技术 函数式编程另一个重要函数 compose,能够将函数进行组合,组合函数只接受一个参数,所以如果有接受多个函数需求并且需要用到...函数 bind 方法核心是利用 call,同时考虑了一些其他情况,例如 bind 返回函数被 new 调用作为构造函数时,绑定值会失效并且改为 new 指定对象 定义了绑定函数 length...关键字处,最终就会形成每当一个 promise 被解析成功就会解析下个 promise,当全部解析成功打印所有解析结果,衍变为现在用最多 async/await 语法 17....原理是递归遍历 right 参数原型链,每次和 left 参数作比较,遍历到原型链终点时则返回 false,找到则返回 true 23. 私有变量实现 ?

    1K30

    2023前端二面经典手写面试题_2023-02-27

    (JSON.stringify(oldObj)); 局限性: 他无法实现对函数 、RegExp等特殊对象克隆 会抛弃对象constructor,所有的构造函数会指向Object 对象有循环引用,会报错...拷贝特殊对象 可继续遍历 对于特殊对象,我们使用以下方式来鉴别: Object.prototype.toString.call(obj); 梳理一下对于可遍历对象会有什么结果: ["object Map...每个普通函数都是 Function实例,箭头函数不是任何类实例,每次调用都是不一样引用。那我们只需要 处理普通函数情况,箭头函数直接返回它本身就好了。 那么如何来区分两者呢?...某个文件时,就将这个文件拿出来执行,如果这个文件里面存在module.exports,当运行到这行代码时将 module.exports 值加入这个对象,键为对应文件名,最终这个对象就长这样: {...(json); // 把文件结果放在exports属性上 } } // tryModuleLoad函数接收是模块对象,通过path.extname来获取模块后缀名,然后使用Module.

    51920

    前端高频手写题自测,你能做出几道

    find 会遍历所有的元素,执行你给定带有条件返回函数符合该条件元素会作为 find 方法返回值如果遍历结束还没有符合该条件元素,则返回 undefinedvar users = [ {id...(json); // 把文件结果放在exports属性上 }}// tryModuleLoad函数接收是模块对象,通过path.extname来获取模块后缀名,然后使用Module....原理是维护一个计时器,规定在delay时间触发函数,但是delay时间内再次触发的话,就会取消之前计时器重新设置。这样一来,只有最后一次操作能被触发。函数节流 :使得一定时间内只触发一次函数。...原理是通过判断是否到达一定时间来触发函数。Object.assignObject.assign()方法用于将所有可枚举属性值从一个或多个对象复制到目标对象。...,等于返回temp函数不被执行而是打印,了解JS朋友都知道对象toString是修改对象转换字符串方法,因此代码中temp函数toString函数return m值,m值是最后一步执行函数

    44630

    JavaScript 常见面试题速查

    因为 JSON 语法是基于 JavaScript ,很容易将 JSONJavaScript对象弄混,但是应该注意 JSONJavaScript对象不是一回事,JSON对象格式更加严格...(数组对象等)并且返回各项值,和 ES3 中 for...in 区别: for...of 遍历获取对象键值, for...in 遍历获取对象键名; for...of 只遍历当前对象不会遍历原型链...,for...in 会遍历对象整个原型链,性能非常差,不推荐使用; 对于数组遍历,for...in 会返回数组所有可以枚举属性(包括原型链上可枚举属性),for...of 只返回数组下标对应属性值... JavaScript 中使用构造函数来新建一个对象,每一个构造函数内部都有一个 prototype 属性,属性值是一个对象,这个对象包含了可以由该构造函数所有实例共享属性和方法。...原型链上所有原型都是对象所有对象最终都是由 Object 构造 Object.prototype 再上一层是 Object.prototype.__proto__。

    52230
    领券