[英]Iterating over JavaScript array in object to display in HTML
我有一个这样的 JS 对象:
{
promo_name: "value",
discount_type: "value",
discount: "value",
products: [
{ id: 1, name: 'name'},
{ id: 2, name: 'name'},
]
}
我的目标是在视图中显示结果。 我的问题是我不知道如何迭代对象内的数组。
数据来自 Ajax 请求,然后解析为 JS 对象。
我使用 jQuery $.each
迭代res
对象并显示属性值,如下所示:
$.each(res, function (key, value) {
$("#coupon_data").show();
$("#coupon_details").html(
'<div class="alert alert-success">' +
'<h4>Promotion Details</h4>' +
'<hr>' +
'<p>Promotion: ' + res.promo_name + '</p>' +
'<p>Discount type: ' + res.discount_type + '</p>' +
'<p>Amount: ' + res.discount + '%</p>' +
'</div>'
);
});
三个属性(res.promo_name、res.discount_type、res.discount)显示,但由于数组长度不同,我无法像这样显示其值:
res.products[0].name
res.products[1].name
我相信我需要遍历对象内部的数组并显示它可能包含的元素数量。 这就是我被困的地方。
如果需要获取计数,请使用Array
的属性length
var count = res.products ? res.products.length : 0;
像这样的东西:
var res = { promo_name: "value", discount_type: "value", discount: "value", products: [{id: 1,name: 'name'}, {id: 2,name: 'name'}] }; $.each(res, function(key, value) { $("#coupon_data").show(); $("#coupon_details").html( '<div class="alert alert-success">' + '<h4>Promotion Details</h4>' + '<hr>' + '<p>Promotion: ' + res.promo_name + '</p>' + '<p>Discount type: ' + res.discount_type + '</p>' + '<p>Amount: ' + res.discount + '%</p>' + '<p>Products: ' + (res.products ? res.products.length : 0) + '</p>' + '</div>' ); });
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <div id='coupon_details'></div>
如果您需要显示数量+产品详情:
var res = { promo_name: "value", discount_type: "value", discount: "value", products: [{id: 1,name: 'name1'}, {id: 2,name: 'name2'}] }; $.each(res, function(key, value) { $("#coupon_data").show(); var html = '<div class="alert alert-success">' + '<h4>Promotion Details</h4>' + '<hr>' + '<p>Promotion: ' + res.promo_name + '</p>' + '<p>Discount type: ' + res.discount_type + '</p>' + '<p>Amount: ' + res.discount + '%</p>' + '<p>Products: ' + (res.products ? res.products.length : 0) + '</p><p>Details:</p>'; if (res.products) { for (var i = 0, {length} = res.products; i < length; i++) { html += '<p><b>Name:</b>' + res.products[i].name + '</p>'; } } $("#coupon_details").html(html); });
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <div id='coupon_details'></div>
在常规 for 循环之外,您还可以使用Array.forEach
var products = [ { id: 123, name: 'name1', { id: 456, name: 'name2' ] products.forEach(function(product) { // do something with each product... })
您的对象有一些拼写错误。
{
promo_name: "value",
discount_type: "value",
discount: "value",
products: [
{ id: 1, name: 'name'},
{ id: 2, name: 'name'},
]
}
关于如何获取对象内数组长度的示例:
var myObj = {
promo_name: "value",
discount_type: "value",
discount: "value",
products: [
{ id: 1, name: 'name'},
{ id: 2, name: 'name'},
]
};
//length of products
myObj.products.length;
//one product
myObj.products[0];
//id of one product:
myObj.products[0].id;
首先,您可以通过使用 StringBuilder 的 JS 等效项来提高性能,StringBuilder 是一个数组,例如:
var h = [
'<div class="alert alert-success">',
'<h4>Promotion Details</h4>',
...
];
$("#coupon_details").html(h.join(''));
其次,不要在你拥有的地方调用 $.each() ,你只需要在属性上调用 $.each ,它是一个数组,比如:
$.each(res.products, function(i, product) {
h.push('<div class=product>', product.name, '</div>');
});
你不需要遍历res
对象,因为没有什么可迭代的,而且它是不可迭代的,相反你应该迭代你的res.products
数组
$("#coupon_data").show();
$("#coupon_details").html(
'<div class="alert alert-success">' +
'<h4>Promotion Details</h4>' +
'<hr>' +
'<p>Promotion: ' + res.promo_name + '</p>' +
'<p>Discount type: ' + res.discount_type + '</p>' +
'<p>Amount: ' + res.discount + '%</p>'
);
$.each(res.products, function (key, value) {
$("#coupon_details").append('<p>Product name: ' + value.name + '</p>');
});
$("#coupon_details").append('</div>');
鉴于您的起点,我reduce
数组reduce
为所有元素的字符串表示形式。
我还使用 ES6 箭头函数和模板语法来使事情更加简洁。 另外,正如其他人所指出的,您不需要$.each
来迭代一个对象,所以我已经删除了它。
const res = { promo_name: "value", discount_type: "value", discount: "value", products: [ { id: 1, name: 'name'}, { id: 2, name: 'name'}, ] } $("#coupon_data").show(); $("#coupon_details").html( '<div class="alert alert-success">' + '<h4>Promotion Details</h4>' + '<hr>' + '<p>Promotion: ' + res.promo_name + '</p>' + '<p>Discount type: ' + res.discount_type + '</p>' + '<p>Amount: ' + res.discount + '%</p>' + '<p>Products: <ul>' + res.products.reduce((accum,curVal) => `${accum}<li>${curVal.id}: ${curVal.name}</li>`,'') + '</ul></p>' + '</div>' );
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <div id="coupon_data"> <div id="coupon_details"> </div> </div>
您可以执行以下操作:
$.each(res, function (key, value) {
$("#coupon_data").show();
var productElements = '' // to store product elements
// iterate product elements, you can use for loop also
res.products.map((product) => {
var {id, name} = product;
productElements += `<p> *any thing you want to use(${id} or ${name})* </p>\n` // html element for product items as string
})
$("#coupon_details").html(
'<div class="alert alert-success">' +
'<h4>Promotion Details</h4>' +
'<hr>' +
'<p>Promotion: ' + res.promo_name + '</p>' +
'<p>Discount type: ' + res.discount_type + '</p>' +
'<p>Amount: ' + res.discount + '%</p>' +
`${productElements}` //final product items
'</div>'
);
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.