单击时将嵌套的 array/object 值显示到单独的元素中
Display nested array/object values into separate elements on click
我目前有一个对象,它有几个嵌套的数组,其中包含另一个对象和一个只有一个数组的对象。它的格式如下:
{
"x": 1409529600000,
"y": 730,
"pf": [
{
"sd": "this is some text"
},
{
"sd": "here is some stuff"
}
],
"nf": [
{
"sd": "im in the nf array"
},
{
"sd": "me too!"
}
],
"t": [
"here is a tip",
"how about the other tip"
]
}
当用户单击 link 时,我想将所有这些数据(减去 x: 和 y:)显示到页面上的元素。例如:
from pf:
<p>this is some text</p>
<p>here is some stuff</p>
from nf:
<p>im in the nf array</p>
<p>me too!</p>
from t:
<p>here is a tip</p>
<p>how about the other tip</p>
如您所见,它有点复杂。我需要通过 pf 和 nf 从每个嵌套的 array/object 中提取值,还需要从 t 的数组中提取这两项,并将它们全部包装在自己的元素中。
我什至不知道从哪里开始。我知道我可以遍历并从两个对象中获取值,但是将所有内容都拉出来、将其绑定到一个元素并显示似乎需要做很多工作。
编辑:为了简化解决方案,我还可以将后端 return t: 作为具有键值的对象。
您需要编写循环遍历对象数组的逻辑并将对象对附加到 DOM。您可以使用 for in
循环。
function start(input) {
for (key in input) {
var typeObject = "[object Object]",
typeArray = "[object Array]";
if (getType(input) == typeObject) {
if (getType(input[key]) == typeObject || getType(input[key]) == typeArray) {
console.log(key + ":");
$("#output").append("from "+key+": <br/>");
start(input[key]);
} else{
console.log(key + ":", input[key]);
$("#output").append("<p>"+key+":"+input[key]+" </p>");
}
} else if (getType(input) == typeArray) {
if (getType(input[key]) == typeObject || getType(input[key]) == typeArray) {
start(input[key]);
} else {
console.log(input[key]);
$("#output").append("<p>"+input[key]+" </p>");
}
}
}
}
start(input);
在此处查看完整代码:http://jsfiddle.net/4urd4qtt/1/
尝试以下方式:
var arr={
"x": 1409529600000,
"y": 730,
"pf": [
{
"sd": "short desc1"
},
{
"sd": "short desc2"
}
],
"nf": [
{
"sd": "short desc1"
},
{
"sd": "short desc2"
}
],
"t": [
"tip text1",
"tip text2"
]
};
function show(){
var str="";
for(a in arr){
if( a=="x" || a=="y"){continue;}
str=str+"from "+a+"<br>";
str1="";
for(z in arr[a]){
if(typeof arr[a][z] === 'object'){
str1=str1+"<p>sd:"+arr[a][z].sd+"</p>";
//str1=str1+"<p>"+arr[a][z].toSource()+"</p>"; //this will displace in object format
}else{
str1=str1+"<p>"+arr[a][z]+"</p>";
}
}
str=str+str1;
}
$("#container2").html(str);// html way of displaying
console.log(str);// displaying the way written in question
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<button id="click" onclick="show()">click</button>
<div id="container2">
</div>
试试这个:
function escapeRegex(string) {
return string.replace(/[\[\]""(){}?*+\^$\.|\-]/g, " ");
}
$('.yourButtonToClick').click(function(){
var htmlForT="";
var htmlForPf="";
var htmlForNf="";
var pf= escapeRegex(JSON.stringify(json.pf));
var nf= escapeRegex(JSON.stringify(json.nf));
var t= escapeRegex(JSON.stringify(json.t));
//For t
var arr = t.split(",");
for (var i = 0; i < arr.length; ++i) {
htmlForT+= "<p>"+arr[i]+"</p>";
}
$(".yourDisplay").append('<p>for t:</p>').append(htmlForT);
//For pf
var arr1 = pf.split(",");
for (var i = 0; i < arr1.length; ++i) {
htmlForPf+= "<p>"+arr1[i]+"</p>";
}
$(".yourDisplay").append('<p>for pf:</p>').append(htmlForPf);
//For nf
var arr2 = nf.split(",");
for (var i = 0; i < arr2.length; ++i) {
htmlForNf+= "<p>"+arr2[i]+"</p>";
}
$(".yourDisplay").append('<p>for nf:</p>').append(htmlForNf);
});
如何使用递归:
function goThroughObj(obj) {
var prop;
for (prop in obj) {
if (obj.hasOwnProperty(prop)) {
if (typeof obj[prop] === "object") {
goThroughObj(obj[prop]);
} else {
document
.getElementById('showObj')
.appendChild(buildData(obj[prop]));
}
}
}
}
你的HTML长得像
<button id="myObj">disp</button>
<div id="showObj"></div>
这是它的工作原理:
首先,您会听到对按钮的点击
(function(){
document
.getElementById('myObj')
.addEventListener("click", showObjData);
}());
然后,on click
它将调用函数 showObjData
function showObjData() {
var key,
title,
element = document.getElementById('showObj');
// clear innerHTML in case user click more than once
element.innerHTML='';
for (key in obj) {
// skip anything that is not an array, ie: x, y
if (obj[key] instanceof Array) {
title = '<br/>From ' + key + ' : ';
element.appendChild(buildData(title));
// use recursive function
// to go through each keys/properties
goThroughObj(obj[key]);
}
}
}
最后但同样重要的是,buildData()
创建要显示的 HTML 元素
function buildData(content) {
var data = document.createElement('p');
data.innerHTML = content;
return data;
}
这里有一个 jsfiddle 给你玩
我目前有一个对象,它有几个嵌套的数组,其中包含另一个对象和一个只有一个数组的对象。它的格式如下:
{
"x": 1409529600000,
"y": 730,
"pf": [
{
"sd": "this is some text"
},
{
"sd": "here is some stuff"
}
],
"nf": [
{
"sd": "im in the nf array"
},
{
"sd": "me too!"
}
],
"t": [
"here is a tip",
"how about the other tip"
]
}
当用户单击 link 时,我想将所有这些数据(减去 x: 和 y:)显示到页面上的元素。例如:
from pf:
<p>this is some text</p>
<p>here is some stuff</p>
from nf:
<p>im in the nf array</p>
<p>me too!</p>
from t:
<p>here is a tip</p>
<p>how about the other tip</p>
如您所见,它有点复杂。我需要通过 pf 和 nf 从每个嵌套的 array/object 中提取值,还需要从 t 的数组中提取这两项,并将它们全部包装在自己的元素中。
我什至不知道从哪里开始。我知道我可以遍历并从两个对象中获取值,但是将所有内容都拉出来、将其绑定到一个元素并显示似乎需要做很多工作。
编辑:为了简化解决方案,我还可以将后端 return t: 作为具有键值的对象。
您需要编写循环遍历对象数组的逻辑并将对象对附加到 DOM。您可以使用 for in
循环。
function start(input) {
for (key in input) {
var typeObject = "[object Object]",
typeArray = "[object Array]";
if (getType(input) == typeObject) {
if (getType(input[key]) == typeObject || getType(input[key]) == typeArray) {
console.log(key + ":");
$("#output").append("from "+key+": <br/>");
start(input[key]);
} else{
console.log(key + ":", input[key]);
$("#output").append("<p>"+key+":"+input[key]+" </p>");
}
} else if (getType(input) == typeArray) {
if (getType(input[key]) == typeObject || getType(input[key]) == typeArray) {
start(input[key]);
} else {
console.log(input[key]);
$("#output").append("<p>"+input[key]+" </p>");
}
}
}
}
start(input);
在此处查看完整代码:http://jsfiddle.net/4urd4qtt/1/
尝试以下方式:
var arr={
"x": 1409529600000,
"y": 730,
"pf": [
{
"sd": "short desc1"
},
{
"sd": "short desc2"
}
],
"nf": [
{
"sd": "short desc1"
},
{
"sd": "short desc2"
}
],
"t": [
"tip text1",
"tip text2"
]
};
function show(){
var str="";
for(a in arr){
if( a=="x" || a=="y"){continue;}
str=str+"from "+a+"<br>";
str1="";
for(z in arr[a]){
if(typeof arr[a][z] === 'object'){
str1=str1+"<p>sd:"+arr[a][z].sd+"</p>";
//str1=str1+"<p>"+arr[a][z].toSource()+"</p>"; //this will displace in object format
}else{
str1=str1+"<p>"+arr[a][z]+"</p>";
}
}
str=str+str1;
}
$("#container2").html(str);// html way of displaying
console.log(str);// displaying the way written in question
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<button id="click" onclick="show()">click</button>
<div id="container2">
</div>
试试这个:
function escapeRegex(string) {
return string.replace(/[\[\]""(){}?*+\^$\.|\-]/g, " ");
}
$('.yourButtonToClick').click(function(){
var htmlForT="";
var htmlForPf="";
var htmlForNf="";
var pf= escapeRegex(JSON.stringify(json.pf));
var nf= escapeRegex(JSON.stringify(json.nf));
var t= escapeRegex(JSON.stringify(json.t));
//For t
var arr = t.split(",");
for (var i = 0; i < arr.length; ++i) {
htmlForT+= "<p>"+arr[i]+"</p>";
}
$(".yourDisplay").append('<p>for t:</p>').append(htmlForT);
//For pf
var arr1 = pf.split(",");
for (var i = 0; i < arr1.length; ++i) {
htmlForPf+= "<p>"+arr1[i]+"</p>";
}
$(".yourDisplay").append('<p>for pf:</p>').append(htmlForPf);
//For nf
var arr2 = nf.split(",");
for (var i = 0; i < arr2.length; ++i) {
htmlForNf+= "<p>"+arr2[i]+"</p>";
}
$(".yourDisplay").append('<p>for nf:</p>').append(htmlForNf);
});
如何使用递归:
function goThroughObj(obj) {
var prop;
for (prop in obj) {
if (obj.hasOwnProperty(prop)) {
if (typeof obj[prop] === "object") {
goThroughObj(obj[prop]);
} else {
document
.getElementById('showObj')
.appendChild(buildData(obj[prop]));
}
}
}
}
你的HTML长得像
<button id="myObj">disp</button>
<div id="showObj"></div>
这是它的工作原理:
首先,您会听到对按钮的点击
(function(){
document
.getElementById('myObj')
.addEventListener("click", showObjData);
}());
然后,on click
它将调用函数 showObjData
function showObjData() {
var key,
title,
element = document.getElementById('showObj');
// clear innerHTML in case user click more than once
element.innerHTML='';
for (key in obj) {
// skip anything that is not an array, ie: x, y
if (obj[key] instanceof Array) {
title = '<br/>From ' + key + ' : ';
element.appendChild(buildData(title));
// use recursive function
// to go through each keys/properties
goThroughObj(obj[key]);
}
}
}
最后但同样重要的是,buildData()
创建要显示的 HTML 元素
function buildData(content) {
var data = document.createElement('p');
data.innerHTML = content;
return data;
}
这里有一个 jsfiddle 给你玩