Javascript 遍历 JSON 个文件级别以填充下拉列表
Javascript iterate through JSON file levels to populate dropdown list
我是 JS 的新手,正在尝试从 JSON 文件传递值来填充下拉列表。我有一个 JSON 文件,看起来像这样:
var mydates = {
"2018": {
"January": ["week1","week2","week3","week4"],
"February": ["week5","week6","week7"],
"March": ["week8","week9","week11"]
},
"2019": {
"January": ["week1","week2","week3","week4"],
"February": ["week5","week6","week7"],
"March": ["week8","week10","week11"]
},
"2020": {
"January": ["week1","week2","week3","week4"],
"February": ["week5","week6","week7"],
"March": ["week8"]
}
}
我想要第一个下拉列表显示列出的年份,第二个下拉列表显示月份,最后一个下拉列表显示周。
我想出了以下方法来填充 id 为“selectedyear”的多年下拉列表,它工作得很好:
years = []
for(var prop in mydates){
console.log(prop)
years.push(prop)}
var myyear = document.getElementById('selectedyear');
for(var i = 0; i < years.length; i++) {
var opt = document.createElement('option');
opt.innerHTML = years[i];
myyear.appendChild(opt);
}
现在我如何遍历 JSON 的第二级,以便 ID 为“selectedmonth”的下拉列表的选项仅显示所选年份的月份,然后用于 ID 为“的下拉列表” selectedweek" 显示所选年月对应的周数??
非常感谢您的帮助!
以下代码初始化并侦听除星期选择之外的任何选择的事件 change
。
const mydates = {
"2018": {
"January": ["week1", "week2", "week3", "week4"],
"February": ["week5", "week6", "week7"],
"March": ["week8", "week9", "week11"]
},
"2019": {
"January": ["week1", "week2", "week3", "week4"],
"February": ["week5", "week6", "week7"],
"March": ["week8", "week10", "week11"]
},
"2020": {
"January": ["week1", "week2", "week3", "week4"],
"February": ["week5", "week6", "week7"],
"March": ["week8"]
}
}
const years = Object.keys(mydates); // years = ['2018', '2019', '2020']
const initalMonths = Object.keys(Object.values(mydates)[0]);
const initialWeeks = mydates[Object.keys(mydates)[0]][initalMonths[0]];
const $yearSelectionOBJ = document.getElementById('selecetedyear');
const $monthSelectionOBJ = document.getElementById('selecetedmonth');
const $weekSelectionOBJ = document.getElementById('selecetedweek');
for (year of years) {
const $optOBJ = document.createElement('option');
$optOBJ.innerHTML = year;
$yearSelectionOBJ.appendChild($optOBJ);
}
for (month of initalMonths) {
const $optOBJ = document.createElement('option');
$optOBJ.innerHTML = month;
$monthSelectionOBJ.appendChild($optOBJ);
}
for (week of initialWeeks) {
const $optOBJ = document.createElement('option');
$optOBJ.innerHTML = week;
$weekSelectionOBJ.appendChild($optOBJ);
}
$yearSelectionOBJ.addEventListener('change', (event) => {
$monthSelectionOBJ.innerHTML = '';
$weekSelectionOBJ.innerHTML = '';
for (month in mydates[event.target.value]) {
const $optOBJ = document.createElement('option');
$optOBJ.innerHTML = month;
$monthSelectionOBJ.appendChild($optOBJ);
}
for (week of mydates[event.target.value][Object.keys(mydates[event.target.value])[0]]) {
const $optOBJ = document.createElement('option');
$optOBJ.innerHTML = week;
$weekSelectionOBJ.appendChild($optOBJ);
}
});
$monthSelectionOBJ.addEventListener('change', (event) => {
$weekSelectionOBJ.innerHTML = '';
for (week of mydates[$yearSelectionOBJ.value][$monthSelectionOBJ.value]) {
const $optOBJ = document.createElement('option');
$optOBJ.innerHTML = week;
$weekSelectionOBJ.appendChild($optOBJ);
}
});
您可以执行以下操作,
var mydates = {
"2018": {
"January": ["week1","week2","week3","week4"],
"February": ["week5","week6","week7"],
"March": ["week8","week9","week11"]
},
"2019": {
"January": ["week1","week2","week3","week4"],
"February": ["week5","week6","week7"],
"March": ["week8","week10","week11"]
},
"2020": {
"January": ["week1","week2","week3","week4"],
"February": ["week5","week6","week7"],
"March": ["week8"]
}
}
var myyear = document.getElementById('selectedyear');
Object.keys(mydates).forEach(year => {
var yearOpt = document.createElement('option');
yearOpt.innerHTML = year;
myyear.appendChild(yearOpt);
let months = Object.keys(mydates[year]);
var myMonth = document.getElementById('selectedmonth');
months.forEach(month => {
var monthOpt = document.createElement('option');
monthOpt.innerHTML = month;
myMonth.appendChild(monthOpt);
var myWeek = document.getElementById('selectedweek');
mydates[year][month].forEach(week => {
let opt = document.createElement('option');
opt.innerHTML = week;
myweek.appendChild(opt);
});
})
})
基本思想是使用来自选择新值的 onchange 事件来填充其他下拉列表的值。下面是一个例子。
const mydates = {
"2018": {
"January": ["week1","week2","week3","week4"],
"February": ["week5","week6","week7"],
"March": ["week8","week9","week11"]
},
"2019": {
"January": ["week1","week2","week3","week4"],
"February": ["week5","week6","week7"],
"March": ["week8","week10","week11"]
},
"2020": {
"January": ["week1","week2","week3","week4"],
"February": ["week5","week6","week7"],
"March": ["week8"]
}
};
const yearSelect = document.getElementById("year");
for (let year in mydates) {
let opt = document.createElement('option');
opt.innerHTML = year;
yearSelect.appendChild(opt);
}
const monthSelect = document.getElementById("month");
const weekSelect = document.getElementById("week");
// delete all options besides the placholder
function clearSelect(select) {
select.querySelectorAll("option:not(.placeholder)").forEach(elem => {
select.removeChild(elem);
});
}
function yearChanged(year) {
monthSelect.querySelector("option.placeholder").innerHTML = "Select a month";
clearSelect(monthSelect);
// add options for the given year
for (let month in mydates[year]) {
let opt = document.createElement('option');
opt.innerHTML = month;
monthSelect.appendChild(opt);
}
monthSelect.value = ''; // select the placeholder
clearSelect(weekSelect);
weekSelect.querySelector("option.placeholder").innerHTML = "Select a month first";
weekSelect.value = ''; // select the placeholder
}
function monthChanged(month) {
weekSelect.querySelector("option.placeholder").innerHTML = "Select a week";
clearSelect(weekSelect)
for (const week of mydates[yearSelect.value][month]) {
let opt = document.createElement('option');
opt.innerHTML = week;
weekSelect.appendChild(opt);
}
weekSelect.value = ''; // select the placeholder
}
<html>
<head></head>
<body>
<select id="year" onchange="yearChanged(this.value)">
<option class="placeholder" value="" disabled selected>Select a year</option>
</select>
<select id="month" onchange="monthChanged(this.value)">
<option class="placeholder" value="" disabled selected>Select a year first</option>
</select>
<select id="week">
<option class="placeholder" value="" disabled selected>Select a month first</option>
</select>
</body>
</html>
我是 JS 的新手,正在尝试从 JSON 文件传递值来填充下拉列表。我有一个 JSON 文件,看起来像这样:
var mydates = {
"2018": {
"January": ["week1","week2","week3","week4"],
"February": ["week5","week6","week7"],
"March": ["week8","week9","week11"]
},
"2019": {
"January": ["week1","week2","week3","week4"],
"February": ["week5","week6","week7"],
"March": ["week8","week10","week11"]
},
"2020": {
"January": ["week1","week2","week3","week4"],
"February": ["week5","week6","week7"],
"March": ["week8"]
}
}
我想要第一个下拉列表显示列出的年份,第二个下拉列表显示月份,最后一个下拉列表显示周。
我想出了以下方法来填充 id 为“selectedyear”的多年下拉列表,它工作得很好:
years = []
for(var prop in mydates){
console.log(prop)
years.push(prop)}
var myyear = document.getElementById('selectedyear');
for(var i = 0; i < years.length; i++) {
var opt = document.createElement('option');
opt.innerHTML = years[i];
myyear.appendChild(opt);
}
现在我如何遍历 JSON 的第二级,以便 ID 为“selectedmonth”的下拉列表的选项仅显示所选年份的月份,然后用于 ID 为“的下拉列表” selectedweek" 显示所选年月对应的周数??
非常感谢您的帮助!
以下代码初始化并侦听除星期选择之外的任何选择的事件 change
。
const mydates = {
"2018": {
"January": ["week1", "week2", "week3", "week4"],
"February": ["week5", "week6", "week7"],
"March": ["week8", "week9", "week11"]
},
"2019": {
"January": ["week1", "week2", "week3", "week4"],
"February": ["week5", "week6", "week7"],
"March": ["week8", "week10", "week11"]
},
"2020": {
"January": ["week1", "week2", "week3", "week4"],
"February": ["week5", "week6", "week7"],
"March": ["week8"]
}
}
const years = Object.keys(mydates); // years = ['2018', '2019', '2020']
const initalMonths = Object.keys(Object.values(mydates)[0]);
const initialWeeks = mydates[Object.keys(mydates)[0]][initalMonths[0]];
const $yearSelectionOBJ = document.getElementById('selecetedyear');
const $monthSelectionOBJ = document.getElementById('selecetedmonth');
const $weekSelectionOBJ = document.getElementById('selecetedweek');
for (year of years) {
const $optOBJ = document.createElement('option');
$optOBJ.innerHTML = year;
$yearSelectionOBJ.appendChild($optOBJ);
}
for (month of initalMonths) {
const $optOBJ = document.createElement('option');
$optOBJ.innerHTML = month;
$monthSelectionOBJ.appendChild($optOBJ);
}
for (week of initialWeeks) {
const $optOBJ = document.createElement('option');
$optOBJ.innerHTML = week;
$weekSelectionOBJ.appendChild($optOBJ);
}
$yearSelectionOBJ.addEventListener('change', (event) => {
$monthSelectionOBJ.innerHTML = '';
$weekSelectionOBJ.innerHTML = '';
for (month in mydates[event.target.value]) {
const $optOBJ = document.createElement('option');
$optOBJ.innerHTML = month;
$monthSelectionOBJ.appendChild($optOBJ);
}
for (week of mydates[event.target.value][Object.keys(mydates[event.target.value])[0]]) {
const $optOBJ = document.createElement('option');
$optOBJ.innerHTML = week;
$weekSelectionOBJ.appendChild($optOBJ);
}
});
$monthSelectionOBJ.addEventListener('change', (event) => {
$weekSelectionOBJ.innerHTML = '';
for (week of mydates[$yearSelectionOBJ.value][$monthSelectionOBJ.value]) {
const $optOBJ = document.createElement('option');
$optOBJ.innerHTML = week;
$weekSelectionOBJ.appendChild($optOBJ);
}
});
您可以执行以下操作,
var mydates = {
"2018": {
"January": ["week1","week2","week3","week4"],
"February": ["week5","week6","week7"],
"March": ["week8","week9","week11"]
},
"2019": {
"January": ["week1","week2","week3","week4"],
"February": ["week5","week6","week7"],
"March": ["week8","week10","week11"]
},
"2020": {
"January": ["week1","week2","week3","week4"],
"February": ["week5","week6","week7"],
"March": ["week8"]
}
}
var myyear = document.getElementById('selectedyear');
Object.keys(mydates).forEach(year => {
var yearOpt = document.createElement('option');
yearOpt.innerHTML = year;
myyear.appendChild(yearOpt);
let months = Object.keys(mydates[year]);
var myMonth = document.getElementById('selectedmonth');
months.forEach(month => {
var monthOpt = document.createElement('option');
monthOpt.innerHTML = month;
myMonth.appendChild(monthOpt);
var myWeek = document.getElementById('selectedweek');
mydates[year][month].forEach(week => {
let opt = document.createElement('option');
opt.innerHTML = week;
myweek.appendChild(opt);
});
})
})
基本思想是使用来自选择新值的 onchange 事件来填充其他下拉列表的值。下面是一个例子。
const mydates = {
"2018": {
"January": ["week1","week2","week3","week4"],
"February": ["week5","week6","week7"],
"March": ["week8","week9","week11"]
},
"2019": {
"January": ["week1","week2","week3","week4"],
"February": ["week5","week6","week7"],
"March": ["week8","week10","week11"]
},
"2020": {
"January": ["week1","week2","week3","week4"],
"February": ["week5","week6","week7"],
"March": ["week8"]
}
};
const yearSelect = document.getElementById("year");
for (let year in mydates) {
let opt = document.createElement('option');
opt.innerHTML = year;
yearSelect.appendChild(opt);
}
const monthSelect = document.getElementById("month");
const weekSelect = document.getElementById("week");
// delete all options besides the placholder
function clearSelect(select) {
select.querySelectorAll("option:not(.placeholder)").forEach(elem => {
select.removeChild(elem);
});
}
function yearChanged(year) {
monthSelect.querySelector("option.placeholder").innerHTML = "Select a month";
clearSelect(monthSelect);
// add options for the given year
for (let month in mydates[year]) {
let opt = document.createElement('option');
opt.innerHTML = month;
monthSelect.appendChild(opt);
}
monthSelect.value = ''; // select the placeholder
clearSelect(weekSelect);
weekSelect.querySelector("option.placeholder").innerHTML = "Select a month first";
weekSelect.value = ''; // select the placeholder
}
function monthChanged(month) {
weekSelect.querySelector("option.placeholder").innerHTML = "Select a week";
clearSelect(weekSelect)
for (const week of mydates[yearSelect.value][month]) {
let opt = document.createElement('option');
opt.innerHTML = week;
weekSelect.appendChild(opt);
}
weekSelect.value = ''; // select the placeholder
}
<html>
<head></head>
<body>
<select id="year" onchange="yearChanged(this.value)">
<option class="placeholder" value="" disabled selected>Select a year</option>
</select>
<select id="month" onchange="monthChanged(this.value)">
<option class="placeholder" value="" disabled selected>Select a year first</option>
</select>
<select id="week">
<option class="placeholder" value="" disabled selected>Select a month first</option>
</select>
</body>
</html>