我有特定的字段--"dataQuery".我想要将此字段内的整个内容上移到一个级别,并最终删除此键本身.原始的JSON是嵌套的,大小可以达到3-4MB.有哪些可能的方法可以做到这一点? 以下面的JSON为例:

{
  "name": "John",
  "age": 25,
  "value": {
        "dataQuery": {
             "nestedField1": "value1",
             "duplicateKey": "value1",
             "dataQuery": {
                 "nestedField2": "value3",
                 "duplicateKey": "value2"
              }
         },
         "child": [{
                "nestedField3": {
                    "dataQuery": { 
                         "nestedField4": "value4"
                     }
                }
         }] 
    }
}

应转化为以下内容:

{
  "name": "John",
  "age": 25,
  "value": {
             "nestedField1": "value1",
             "nestedField2": "value3",
             "duplicateKey": "value2"
         ,
         "child": [{
                "nestedField3": { 
                     "nestedField4": "value4"
                }
         }] 
    }
}

推荐答案

What about reviver directly during JSON.parse?

如果你可以在接收string源的同时接入数据管道,那么你可以在做JSON.parse的同时立即实现你的目标,通过利用the second JSON.parse parameter, the "reviver" function:

const unfoldKey = 'dataQuery';

function reviver(key, val) {
  if (val.hasOwnProperty(unfoldKey)) {
    const unfold = val[unfoldKey];
    // `val[unfoldKey]` assumed to be always *object*
    // no type checks here for brevity
    for (const k in unfold) {
      val[k] = unfold[k];
    }
    delete val[unfoldKey];
  }
  return val
}

const resultObject = JSON.parse(getJSONstr(), reviver);

console.log(JSON.stringify(resultObject, null, 2));

function getJSONstr() {
  return `{
  "name": "John",
  "age": 25,
  "value": {
    "dataQuery": {
      "nestedField1": "value1",
      "duplicateKey": "value1",
      "dataQuery": {
        "nestedField2": "value3",
        "duplicateKey": "value2"
      }
    },
    "child": [
      {
        "nestedField3": {
          "dataQuery": {
            "nestedField4": "value4"
          }
        }
      }
    ]
  }
}`;
};
.as-console-wrapper {
  inset: 0 !important;
  max-height: none !important;
}

这有一个很好的好处,那就是它给您的数据看起来像是"一遍"(递归在那里,但被扫到本机方法的内部;但每个键总是只激活一次),所以它可能比首先创建"错误的"对象并将它或其副本(S)雕刻成所需的形状更有效率.

(显然,您也可以在Stringied对象上执行此操作,但与没有"错误" struct 相比,它的效率就不会那么高了.)

唯一的缺点是它明显改变了属性的顺序.我猜这是因为它必须从最深的嵌套值开始,删除属性会扰乱插入顺序,或者其他什么.我不确定它能否进一步改进,但也许无论如何都无关紧要(?)

Javascript相关问答推荐

为什么我达到了时间限制!?LeetCode链接列表循环(已解决,但需要解释!)

React Code不在装载上渲染数据,但在渲染上工作

构造HTML表单以使用表单数据创建对象数组

PDF工具包阿拉伯字体的反转数字

覆盖加载器页面避免对页面上的元素进行操作

如何使用TypeScrip设置唯一属性?

使用auth.js保护API路由的Next.JS,FETCH()不起作用

Rxjs流中生成IMMER不能在对象上操作

如何在JAVASCRIPT中合并两组对象并返回一些键

如何在DYGRAPS中更改鼠标事件和键盘输入

令牌JWT未过期

未捕获语法错误:Hello World中的令牌无效或意外

为列表中的项目设置动画

用另一个带有类名的div包装元素

P5JS-绘制不重叠的圆

如何让SVG图标在被点击和访问后改变 colored颜色 ,并在被访问后取消点击时恢复到原来的 colored颜色 ?

Django模板中未加载JavaScript函数

如何处理不带参数的redux thunk payloadCreator回调函数?

如果未定义,如何添加全局变量

我如何让我的弹力球在JavaScript和HTML画布中相互碰撞后改变 colored颜色 ?