Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从数组到HTML字符串的JavaScript_Javascript_Arrays - Fatal编程技术网

从数组到HTML字符串的JavaScript

从数组到HTML字符串的JavaScript,javascript,arrays,Javascript,Arrays,有人能帮我解决这个JavaScript任务吗 我必须实现一个JavaScript函数,它接受一个数组并返回生成的HTML字符串 示例:[标记名,child1,child2,…] •标记名始终是数组中的第一个条目,是一个字符串 •子项可以是数组或字符串 •如果子项是字符串,则将其视为纯文本,而不是HTML标记 •如果子元素是数组,则将其视为嵌套元素 •不支持属性、注释等,只支持元素和文本 •空标签应自动关闭 •连续文本节点合并到完成的输出中 •没有库、构建过程或传输程序 示例: ['div']

有人能帮我解决这个JavaScript任务吗

我必须实现一个JavaScript函数,它接受一个数组并返回生成的HTML字符串

示例:[标记名,child1,child2,…]

•标记名始终是数组中的第一个条目,是一个字符串

•子项可以是数组或字符串

•如果子项是字符串,则将其视为纯文本,而不是HTML标记

•如果子元素是数组,则将其视为嵌套元素

•不支持属性、注释等,只支持元素和文本

•空标签应自动关闭

•连续文本节点合并到完成的输出中

•没有库、构建过程或传输程序

示例:

['div']                       => '<div/>'

['h1', 'Text']                => '<h1>Text</h1>'

['span', 'More', 'Text']      => '<span>MoreText</span>'

['a', ['b', 'More'], ' Text'] => '<a><b>More</b> Text</a>'

['p', '<b>Text</b>']          => '<p>&lt;b&gt;Text&lt;/b&gt;</p>'
这是到目前为止我的代码,它使用对象而不是数组。你知道怎么转换吗

var obj = {
  "h1": 'text',
  "a": {"b": 'more'}, // nested element
  "text": '', // empty tag
  "p": '<b>text</b>' // with HTML
};

var finalString = '';

function createHTML(obj){
  for (var prop in obj) {
    if (obj.hasOwnProperty(prop)) { 

    if (obj[prop] == '[object Object]') {

      finalString += "<" + prop + ">";
      createHTML(obj[prop]);
      finalString += "</" + prop + ">";

    } else {
      if (obj[prop] == '') {
        finalString += "<" + prop + "/>";
      } else {
        finalString += "<" + prop + ">" + encodeURI(obj[prop]) + "</" + prop + ">";
      }
    }
  } 
}
}

createHTML(obj);

console.log(finalString);
// "<h1>text</h1><a><b>more</b></a><text/><p>%3Cb%3Etext%3C/b%3E</p>"

您可以使用一些递归方法:

通过生成DOM元素对象: 函数genMarkuparr{ //使用第一个数组项创建dom元素对象 var ele=document.createElementarr[0]; //迭代剩余的元素 arr.slice1.forEachfunctionv{ //如果项是数组,则递归调用该函数 //并附加返回的元素 if Array.isArrayv ele.childgenmarkupv; //否则生成一个文本节点并追加 其他的 ele.appendChilddocument.createTextNodev; } //返回元素引用 返回ele; } [['div'],['h1','Text'],['span','More','Text'],['a',['b','More'],'Text'],['p','Text']。forEachfunctiond{ //获取outerHTML属性以获取html内容 console.logJSON.stringifyd+'=>'+genMarkupd.outerHTML;
}欢迎来到StackOverflow,请发布您尝试过的代码。欢迎来到SO。因此,这不是编码服务。请将您尝试过的代码以及可能遇到的问题添加到您的问题中。欢迎使用堆栈溢出!请阅读并通读,尤其是做你的研究,了解与SO相关的主题,以及。如果你在做了更多的研究和搜索后陷入困境,无法摆脱困境,请发布一份你的尝试,并明确指出你陷入困境的地方。人们会乐意帮忙的。祝你好运您需要对对象进行类型检查,然后使用该对象作为结果调用该函数,例如,如果同一个函数的递归调用具有不同参数,那么typeof obj[prop]==='object'{finalstring+=createHTMLobj[prop];}。这是一个奇妙的解决方案,非常聪明。非常感谢你@arthuruk:很高兴提供帮助:很好的解决方案+1为了遵守规范,我将添加.outerHTML.replace//,转换为