javascript - 覆盖数组中的值

标签 javascript json multidimensional-array

尝试使用此 JSON/HTML 生成器,一旦用户将所有相应数据输入到输入字段中,该生成器将为用户显示 JSON 数据和关联的 HTML 元素。我知道问题是什么,但我不知道如何解决它。当我尝试生成 JSON 时,第一组 level_2_objName 中的值 被存储,然后移动到下一组 level_2_objName 中,因为该特定输入的 ID 名称被重置为 level_2_objName + j。您可以在此处看到控制台输出 => console output有任何想法吗?我知道修复需要在 parseData()

的 for 循环内部进行

var categoryAmount 		= document.getElementById('category_amount');
var generateBtn 		= document.getElementById('generate_btn');
var parseBtn 			= document.getElementById('parse_btn');
var generatedInputs 	= document.getElementById('generated_inputs');
var generatedJson 		= document.getElementById('generated_json');
var parsedContainer 	= document.getElementById('container_parsed-html');
var totalCategoryAmount = parseInt(categoryAmount.value);

// create arrays and objects that will hold the JSON data
var AllLevelsArray = [];
var level_1_name_array = [];

function createInputs() {
	var listContainer = document.createElement('div');
	listContainer.className = 'list_container';

	var level_1_label = document.createElement('h3');
	level_1_label.textContent = 'Name of level-1 category #' + (i + 1);

	var level_1_name = document.createElement('input');
	level_1_name.className = 'form-control ' + 'level_1-name' + [i] + ' level_1';
	level_1_name.setAttribute('placeholder', 'Level-1 name');

	var level_2_list_label = document.createElement('h3');
	level_2_list_label.textContent = 'How many level 2 categories for #' + (i + 1);

	var level_2_list_amount = document.createElement('input');
	level_2_list_amount.className = 'form-control ' + 'level_2_list_amount' + [i] + ' level_2';
	level_2_list_amount.setAttribute('placeholder', 'How many level 2 categories?');
	level_2_list_amount.setAttribute('id', 'level_2_list_amount' + [i])

	var level_2_gen_btn = document.createElement('button');
	level_2_gen_btn.className = 'btn btn-default level_2-btn';
	level_2_gen_btn.textContent = 'Generate level 2';

	listContainer.appendChild(level_1_label);
	listContainer.appendChild(level_1_name);
	listContainer.appendChild(level_2_list_label);
	listContainer.appendChild(level_2_list_amount);
	listContainer.appendChild(level_2_gen_btn);
	generatedInputs.appendChild(listContainer);

	level_1_name_array.push(level_1_name);

	level_2_gen_btn.addEventListener('click', function() {

		for(i = 0; i < level_2_list_amount.value; i++) {
			var level_2_label = document.createElement('h4');
			level_2_label.textContent = 'Info for level 2 category #' + (i + 1);

			var level_2_name = document.createElement('input');
			level_2_name.className = 'form-control';
			level_2_name.setAttribute('id', 'level_2_name' + [i]);
			level_2_name.setAttribute('placeholder', 'level 2 name');

			var level_2_url = document.createElement('input');
			level_2_url.className = 'form-control';
			level_2_url.setAttribute('id', 'level_2_url' + [i]);
			level_2_url.setAttribute('placeholder', 'level 2 url');

			// save for after we finish storing data for level 2
			// var level_3 = document.createElement('input');
			
			listContainer.appendChild(level_2_label);
			listContainer.appendChild(level_2_name);
			listContainer.appendChild(level_2_url);
		}
		// this is for each individual level 2 generator button
		this.setAttribute('disabled', 'true');
	}, false)
}

function appendInputs() {
	totalCategoryAmount = parseInt(categoryAmount.value)
	console.log(totalCategoryAmount);

	generateBtn.setAttribute('disabled', 'true');

	for(i = 0; i < totalCategoryAmount; i++) {
		createInputs();
	}
}

function parseData() {
	for(var i = 0; i < totalCategoryAmount; i++) {
		var level_1_object = {};
		var level_2_list = [];
		
		var level_2_list_amount = document.getElementById('level_2_list_amount' + i);
		console.log(level_2_list_amount.value);

		level_1_object['level-1'] = level_1_name_array[i].value;

		for(var j = 0; j < level_2_list_amount.value; j++) {
			var level_2_objects = {};
			var level_2_objName = document.getElementById('level_2_name' + j);
			console.log(level_2_objName);
			console.log(level_2_objName.value);
			
			level_2_objects['L2-name'] = level_2_objName.value;
			level_2_list.push(level_2_objects);
			level_1_object['level-2-list'] = level_2_list;
		}

		AllLevelsArray.push(level_1_object);
	}
	console.log(AllLevelsArray);
	
	generated_json.textContent = JSON.stringify(AllLevelsArray, null, 4);
}

generateBtn.addEventListener('click', appendInputs, false);
parseBtn.addEventListener('click', parseData, false);
<div class="container header">
		<div class="row">
			<div class="col-xs-12">
				<img class="logo" src="img/nav-logo.png">
				<h1>Nav Generator</h1>
			</div>
		</div>

		<div class="row">
			<div class="col-xs-6">
				<h2>How it works</h2>
				<ol>
					<li>Enter the number of level-1 categories you will need</li>
					<li>Enter the number of respective you will need for level-2 and/or level-3 categories</li>
				</ol>
			</div>
			<div class="row">
				<div class="col-xs-6 generate_container">
					<form class="form-group">
						<label>How many Level-1 Categories do you need?</label>
						<input type="text" class="form-control" id="category_amount" placeholder="Category Amount">
						<button type="button" class="btn btn-default" id="generate_btn">Generate</button>
						<button type="button" class="btn btn-primary" id="parse_btn">Parse HTML</button>
					</form>
				</div>
			</div>
		</div>
	</div>

	<div class="container-fluid">
		<div class="row">
			<div class="col-xs-7" id="generated_inputs">

			</div>
			<div class="col-xs-5" id="generated_json">

			</div>
		</div>
	</div>

	<div class="container-fluid">
		<div class="row">
			<div class="col-xs-12" id="container_parsed-html">

			</div>
		</div>
	</div>

最佳答案

问题在于 2 级输入字段的选择。您可以通过 ID 选择它们:var level_2_objName = document.getElementById('level_2_name' + j);

j 从零开始,每个级别为 1。 id 在整个文档中必须是唯一的。如果创建两个具有相同 id 的元素,则会违反 html 标准。所有常见浏览器都接受它,但如果您选择一个 id,它每次都会返回具有该 id 的第一个元素。

解决方案 您的问题不需要 id。请改用 css 类或名称属性。一个 css 类可以在文档中多次使用,并且您可以选择其 css 类上的每个元素。与 name 属性相同。 name 属性提供了使用数组表示法的可能性:nameOfElement[]。所以你不需要对你的 id 进行连续编号(这从来都不是一个好主意,而且是不好的编码风格。如果你需要对你的 id 进行编号,大多数时候它表明了设计问题)。

关于javascript - 覆盖数组中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45848830/

相关文章:

java - 如何在JAVA中读取python字典字符串

java - 在java中将2个数组变成二维数组

javascript - 如果用户单击一个复选框,jquery 会切换其他复选框

javascript - 如何在查找中使用变量(Jquery)

javascript - Electron 生成器目标 : mac vs. mas

javascript - 如何使字符串兼容 JSON.parse()

javascript - 未捕获的语法错误 : Unexpected end of input While doing JSON. 解析

Python - 如何调整数组大小并复制元素

php - PHP 是否处理多维 $_REQUEST 数组?

javascript - 管理js依赖