Javascript 带下划线和主干的JSON对象树递归
假设我有一个json对象,其嵌套数组的深度未知。我想将每个数组馈送到一个u.template函数中。例如,我的json对象可能如下所示:Javascript 带下划线和主干的JSON对象树递归,javascript,jquery,backbone.js,underscore.js,Javascript,Jquery,Backbone.js,Underscore.js,假设我有一个json对象,其嵌套数组的深度未知。我想将每个数组馈送到一个u.template函数中。例如,我的json对象可能如下所示: $start_elements = array ( array( "elementTag"=>"li", "elementClass"=>"dashboard", "elementContent"=>array( "elem
$start_elements = array (
array(
"elementTag"=>"li",
"elementClass"=>"dashboard",
"elementContent"=>array(
"elementTag"=>"a",
"elementContent"=>"Dashboard",
"href"=>"#home"
)
),
array(
"elementTag"=>"li",
"elementClass"=>"count indicator",
"elementContent"=>array(
array(
"elementTag"=>"span",
"elementClass"=>"data-count='8'",
"elementContent"=>"Notifications"
),
array(
"elementTag"=>"ul",
"elementClass"=>" ",
"elementContent"=>array(
"elementTag"=>"li",
"elementContent"=>array(
"elementTag"=>"a",
"href"=>"#",
"elementExtra"=>"data-modal",
"elementContent"=>array(
array(
"elementTag"=>"h4",
"elementContent"=>"Lorem Ipsum"
),
array(
"elementTag"=>"<p>",
"elementContent"=>"Lorem ipsum dolor sit imet smd ddm lksdm lkdsm"
)
)
)
)
)
)
)
);
json_encode($start_elements);
$start\u elements=数组(
排列(
“elementTag”=>“li”,
“elementClass”=>“仪表板”,
“elementContent”=>数组(
“elementTag”=>“a”,
“elementContent”=>“仪表板”,
“href”=>“#主页”
)
),
排列(
“elementTag”=>“li”,
“elementClass”=>“计数指示器”,
“elementContent”=>数组(
排列(
“elementTag”=>“span”,
“elementClass=>“数据计数=”8',
“elementContent”=>“通知”
),
排列(
“elementTag”=>“ul”,
“elementClass=>”,
“elementContent”=>数组(
“elementTag”=>“li”,
“elementContent”=>数组(
“elementTag”=>“a”,
“href”=>“#”,
“elementExtra”=>“数据模式”,
“elementContent”=>数组(
排列(
“elementTag”=>“h4”,
“elementContent”=>“Lorem Ipsum”
),
排列(
“elementTag”=>“”,
“elementContent”=>“Lorem ipsum dolor sit imet smd ddm lksdm lksdm”
)
)
)
)
)
)
)
);
json_编码($start_元素);
_.模板:
_.template('<<%= elementTag %> class="<%= elementClass %>" href="<%= href %>"><%= elementContent %></<%= elementTag %>')
\uuu.template(“您可以执行以下操作:
function applyTemplate(obj){
if _.has(obj, "elementContent"){
obj.elementContent = applyTemplate(obj.elementContent)
}
return _.template("templateString", obj)
}
函数applyTemplate(obj){
如果有(对象,“元素内容”){
obj.elementContent=applyTemplate(obj.elementContent)
}
return.template(“templateString”,obj)
}
基本上,您可以遍历整个树,将elementContent
替换为从下到上的模板值。我会在模板周围创建一个包装函数,以保持模板的无逻辑性。然后您可以使用下划线的实用方法检查是否有数组、对象(或字符串)(.isArray
和.isObject
)在您的手中
您需要将包装器函数传递到模板中,以便使用它。您可以使用{tmpl:tmpl}
扩展数据
下面是一个简化的工作示例:
var data = {
elementTag: "li",
elementContent: [{
elementTag: "a",
elementContent: "Dashboard"
}, {
elementTag: "div",
elementContent: "Hello"
}]
};
var tmpl = _.template('<<%= elementTag %>><%= template(elementContent) %></<%= elementTag %>>');
function template(elData) {
var html = "";
if (_.isArray(elData)) {
_.each(elData, function (el) {
html += template(el);
});
} else if (_.isObject(elData)) {
html = tmpl(_.extend({
template: template
}, elData));
} else {
html = elData;
}
return html;
}
console.log(template(data));
var数据={
元素标签:“li”,
元素内容:[{
元素标签:“a”,
elementContent:“仪表板”
}, {
元素标签:“div”,
元素内容:“你好”
}]
};
var tmpl=389;.template(“”);
功能模板(elData){
var html=“”;
如果(u.isArray(elData)){
_.每个(elData,功能(el){
html+=模板(el);
});
}否则如果(u.isObject(elData)){
html=tmpl(u.extend({
模板:模板
},elData));
}否则{
html=elData;
}
返回html;
}
console.log(模板(数据));
这个循环会发生吗?我似乎无法让它工作,但我认为它可能只是试图返回模板中最深的对象…我应该工作,我没有测试它,但它会通过all树,然后替换所有元素内容
并在对象中替换它们。请注意,您的示例并不表示树,而是表示st确认。如果elementContent中的子元素是数组而不是对象,会发生什么情况?(请参见上面编辑的答案)。数组中是否应该出现某种形式的u.每次迭代?然后将obj.elementContent=applyTemplate(obj.elementContent)
替换为obj.elementContent=obj.elementContent.map(函数(obj1){return applyTemplate(obj1.elementContent)}
这不是JSON,我也看不到任何数组。如果elementContent中的子元素是数组而不是对象,会发生什么情况?(请参见上面编辑的答案)。数组的情况下是否应该有某种1。每次迭代都会发生?