如何从兼容 JSON 的嵌套对象/数据结构递归生成类似标记的字符串?

如何解决如何从兼容 JSON 的嵌套对象/数据结构递归生成类似标记的字符串?

let json =  {
    "user": {
        "first_name": "test","second_name": "second name","profile": {
            "test":{
                "img": "img"
            }      
        }
    },"company": {
        "name": "company 1","company_nested": {
            "test" : "test"
        }
    }
}
let new_json = "";

function iterate(obj) {
    Object.keys(obj).forEach((key,index) => {
        let value = obj[key];
        if(typeof value === 'string') {         
            new_json += `"${key}": ${value}\n`;         
        }

        if (typeof value === 'object') {     
            new_json +=`##${key}##\n`;
            iterate(value);     
        }                   
    });
}
    
iterate(json);
$("#teste").html(new_json);

结果

##user##
"first_name": test
"second_name": second name
##profile##
##test##
"img": img

有没有更好的方法来改变我想要的东西(自定义的)的花括号?

  • 左括号 ({) 必须是 ##KEY_NAME##
  • 后括号 (}) 必须是 ##/KEYNAME##

想要的结果

##user##
"first_name": test
"second_name": second name
##profile##
##test##
"img": img
##/test##
##/profile##
##/user##

##company##
"name": company 1
##company_nested##
"test": test
##/company_nested##
##/company##

解决方法

您可以遍历对象的条目。如果值为对象,则递归调用该函数并将对象包装在 ##${k}####/${k}##

const input={user:{first_name:"test",second_name:"second name",profile:{test:{img:"img"}}},company:{name:"company 1",company_nested:{test:"test"}}};

function replace(o) {
  return Object.entries(o).map(([k,v]) => {
    if (typeof v === 'object')
      return `##${k}##
${replace(v)}
##/${k}##`
    else
      return `"${k}": ${v}`
  }).join("\n")
}

console.log(replace(input))

如果多行模板文字难以阅读,您可以创建一个数组并使用 join

const replace = o =>
  Object.entries(o).map(([k,v]) =>
      typeof v === 'object' 
          ? [`##${k}##`,replace(v),`##/${k}##`].join('\n') 
          : `"${k}": ${v}`
  ).join("\n")
,

我会假设您的 json 格式正确。如果没有,您可能需要在代码中处理。

步骤 1:将您的 json 转换为字符串。

let str = JSON.stringify(json);

第 2 步:创建一个符号映射,将现有符号作为键,将新符号作为值。

let symbolMap = new Map();
symbolMap.set("{","$");
symbolMap.set("}","%");

对字符串中的每个字符进行迭代,检查该字符是否存在于map中,如果存在则替换新值。

for (let i = 0; i < str.length; i++) {
  if (symbolMap.get(str[i])) {
    str = str.replace(str[i],symbolMap.get(str[i]));
  }
}

打印输出

console.log(str);

输出: 之前:

{"user":{"first_name":"test","second_name":"second name","profile":{"test":{"img":"img"}}},"company":{"name":"company 1","company_nested":{"test":"test"}}}

之后:

$"user":$"first_name":"test","profile":$"test":$"img":"img"%%%,"company":$"name":"company 1","company_nested":$"test":"test"%%%

完整代码:

let json = {
  user: {
    first_name: "test",second_name: "second name",profile: {
      test: {
        img: "img",},company: {
    name: "company 1",company_nested: {
      test: "test",};

let str = JSON.stringify(json);

let symbolMap = new Map();
symbolMap.set("{","%");

console.log(str);

for (let i = 0; i < str.length; i++) {
  if (symbolMap.get(str[i])) {
    str = str.replace(str[i],symbolMap.get(str[i]));
  }
}

console.log(str);


,

此方法基于单个递归调用的 reducer 函数。由于可以通过 reducer 函数的第一个参数进行配置,它也是一个通用的标记生成解决方案......

function createCustomMarkupRecursively(collector,[key,value],idx) {
  collector.config = collector.config || {};
  collector.level = collector.level || 0;

  const {
    markup = '',config: {
      quote = '"',prefix = '##',suffix = '##',terminator = '/',separator = '\n',} = collector;

  const markupBlockSeparator = ((collector.level === 0) && (idx > 0))
    ? separator
    : '';

  if (value && (typeof value === 'object')) {
    ++collector.level;

    collector.markup = [
      markup,markupBlockSeparator,`${ prefix }${ key }${ suffix }\n`,Object.entries(value).reduce(
        createCustomMarkupRecursively,Object.assign(collector,{ markup: ''}),).markup,`${ prefix }${ terminator }${ key }${ suffix }\n`,].join('');

    --collector.level;
  } else {
    collector.markup = [
      markup,quote,key,`: ${ value }\n`,].join('');
  }

  return collector;
}

const data =  {
  user: {
    first_name: "test",company_nested: {
      test : "test",};
const { markup } = Object
  .entries(data)
  .reduce(createCustomMarkupRecursively,{/*
    config: {
      quote: '"',prefix: '##',suffix: '##',terminator: '/',separator: '\n'
    },*/
    markup: '',});

// according to the OP ...
console.log(markup);

// customization sample ...
console.log(
  Object
  .entries(data)
  .reduce(createCustomMarkupRecursively,{

    config: {
      quote: "'",prefix: '<',suffix: '>',terminator: '$',separator: '\n<-- // -->\n\n',markup: '## another markup configuration result ##\n\n',}).markup
)
.as-console-wrapper { min-height: 100%!important; top: 0; }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?