#javascript #jquery
#javascript #jquery
Вопрос:
У меня есть следующий массив.
[
{
"costprice": "12.00",
"costpricemarker": "12.00",
"discount": 0,
"itemName": "Cheese cake",
"itemid": "812",
"price": "22.00",
"quantity": 1
},
{
"costprice": "12.00",
"costpricemarker": "12.00",
"discount": 0,
"itemName": "Milo",
"itemid": "811",
"price": "22.00",
"quantity": 2
},
{
"costprice": "12.00",
"costpricemarker": "12.00",
"discount": 0,
"itemName": "Orange Juice",
"itemid": "809",
"price": "22.00",
"quantity": 2
}
]
Первый выбор заполняется следующим кодом:
var tableItems = JSON.parse(localStorage.getItem('item'));
for (var i = 0; i < tableItems.length; i ) {
$('#sbOne').append('<option value='' tableItems[i] ''>'
tableItems[i]['itemName'] '</option>');
if (tableItems[i]['itemName'] >) {
$('#sbOne').append('<option value='' tableItems[i] ''>'
tableItems[i]['itemName'] '</option>');
}
}
Это приводит к сырному пирогу, Майло, апельсиновому соку в мультиселекте. Однако, поскольку апельсиновый сок и Майло имеют количество 2, я хочу, чтобы моим результатом был сырный пирог, Майло, Майло, апельсиновый сок, апельсиновый сок
Что я пробовал:
for (var i=0 ;i<tableItems.length; i ) {
$("#sbOne").append("<option value='" tableItems[i] "'>"
tableItems[i]['itemName'] "</option>");
if (tableItems[i]['quantity'] >1) {
$("#sbOne").append("<option value='" tableItems[i] "'>"
tableItems[i]['itemName'] "</option>");
}
}
Это не работает так, как я хочу, как добавить все элементы с учетом количества.
Комментарии:
1. Вы можете просто использовать другой
for
цикл и настроить его на цикл надquantity
tableItems[i]
:for (var j=0; j<tableItems[i]['quantity']; j ) { $("#sbOne").append("<option value='" tableItems[i] "'>" tableItems[i]['itemName'] "</option>"); }
2. Вы что-то упускаете после того
>
, как вif (tableItems[i]['itemName'] >)
Ответ №1:
Как насчет этого:
var tableItems = JSON.parse(localStorage.getItem('item'));
for (var i=0 ;i<tableItems.length; i ) {
quantity = tableItems[i]["quantity"]
for (var x=0; x<quantity ; x ) {
//do your appending here ....
$("#sbOne").append("<option value='" tableItems[i] "'>" tableItems[i]['itemName'] "</option>")
}
}
Возможно, вам потребуется настроить фактическую добавляемую строку, поскольку я не совсем знаком с контекстом элемента, который вы добавляете…
Комментарии:
1. спасибо, предложенный в комментарии способ также работает, но поскольку для вашего решения потребуется меньше кода, я бы предпочел его.
Ответ №2:
возможно, вы можете упростить свой код и использовать innerHTML для однократного ввода HTML.
const tableItems = [
{
"costprice": "12.00",
"costpricemarker": "12.00",
"discount": 0,
"itemName": "Cheese cake",
"itemid": "812",
"price": "22.00",
"quantity": 1
},
{
"costprice": "12.00",
"costpricemarker": "12.00",
"discount": 0,
"itemName": "Milo",
"itemid": "811",
"price": "22.00",
"quantity": 2
},
{
"costprice": "12.00",
"costpricemarker": "12.00",
"discount": 0,
"itemName": "Orange Juice",
"itemid": "809",
"price": "22.00",
"quantity": 2
}
];
document.getElementById("sbOne").innerHTML = tableItems.map(item => {
const html = [];
let qty = item.quantity;
while (qty-- > 0) {
html.push(`<option value="${item.itemid}">${item.itemName}</option>`);
}
return html.join("");
}).join("");
<select id="sbOne">
</select>
Ответ №3:
Как упоминали другие, вы можете сделать это с помощью вложенного цикла for , или вы можете сделать это с помощью простой строки (также для управления DOM только один раз после подготовки всех элементов)
const itemsHTML = tableItems.map(item =>
Array(item.quantity).fill("<option value='" item.itemid "'>" item.itemName "</option>").join('')
).join('');
$("#sbOne").append(itemsHTML)
Ответ №4:
Обратите внимание, что эта ваша строка:
"<option value='" tableItems[i] "'>"
приводит к этому:
<option value="[object Object]">
[object Object]
это совсем не полезно.
Вы, вероятно, предполагали это:
"<option value='" JSON.stringify(tableItems[i]) "'>"
который сохранит элемент в виде строки JSON в <object>
значение:
<option value="{" costprice":"12.00","costpricemarker":"12.00","discount":0,"itemname":"orange="" juice","itemid":"809","price":"22.00","quantity":2}"="">Orange Juice</option>
Вот версия вашего кода, которая использует некоторые функции ES6:
const tableItems = [
{
"costprice": "12.00",
"costpricemarker": "12.00",
"discount": 0,
"itemName": "Cheese cake",
"itemid": "812",
"price": "22.00",
"quantity": 1
},
{
"costprice": "12.00",
"costpricemarker": "12.00",
"discount": 0,
"itemName": "Milo",
"itemid": "811",
"price": "22.00",
"quantity": 2
},
{
"costprice": "12.00",
"costpricemarker": "12.00",
"discount": 0,
"itemName": "Orange Juice",
"itemid": "809",
"price": "22.00",
"quantity": 2
}
];
let mySelect = $("#mySelect");
// create all the select content
const selectContent = tableItems.reduce((acc, el) => {
const {itemName, quantity} = el;
// create `quantity` number of <option> elements
for (let i = 0; i < quantity; i ) {
acc = `
<option value="${JSON.stringify(el)}">${itemName}</option>`;
}
return acc;
}, {});
// add content to select
mySelect.empty();
mySelect.append(selectContent);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<select id="mySelect" multiple="true" size="5"></select>