JavaScript - 遍历表单输入并收集值作为对象中的键值对
JavaScript - Iterate over form inputs and collect values as key value pairs in object
我试图通过迭代输入然后将它们存储为对象数组中的 key/value 对来从表单中的多个输入字段收集值。但是,我正在努力寻找一种有效的方法来执行此操作,该方法不涉及长集 if if else 或 switch 语句。
概念:
<form>
<input type="text">
<input type="text">
<input type="text">
<input type="text">
</form>
我想避免的事情:
var inputs = document.querySelectorAll('input');
for (var i = 0; i < inputs.length; i++) {
var myObject = {};
if (i = 0) {
myObject.val0 = inputs[i];
} else if (i = 1) {
myObject.val1 = inputs[i];
} else if (i = 2) {
myObject.val2 = inputs[i];
} else if (i = 3) {
myObject.val3 = inputs[i];
}
}
关于如何更有效地完成这项工作有什么建议吗?我的一个想法是使用括号表示法根据现有的 html 元素属性(可能是 id、名称或自定义数据属性)动态设置键值。
为每个输入字段添加一个唯一的 id
(为您的对象指定一个键)。
<form>
<input id="firstName" type="text">
<input id="lastName" type="text">
<input id="email" type="email">
<input id="number" type="text">
</form>
现在保存id为key,value为value:
var inputs = document.querySelectorAll('input');
var myObject = {};
for (var i = 0; i < inputs.length; i++) {
myObject[inputs[i].id] = inputs[i].value;
}
console.log(myObject) // {firstName: "", lastName: "", email: "", number: ""}
将其全部转换为一个函数,其形式如下:
function getFormValues(formId) {
var inputs = document.querySelectorAll('#' + formId + ' input');
var formValues = {};
for (var i = 0; i < inputs.length; i++) {
formValues[inputs[i].id] = inputs[i].value;
}
return formValues;
}
总计:
<form id="registerForm">
<input id="firstName" type="text">
<input id="lastName" type="text">
<input id="email" type="email">
<input id="number" type="text">
</form>
getFormValues('registerForm'); // {firstName: "", lastName: "", email: "", number: ""}
现在您可以进一步扩展该函数,使其处理数组值等。
首先,您应该在 for 循环之外声明变量,否则您将在每次 for 循环运行时都声明。
此外,您可以使用括号表示法代替点表示法来实现这一点。
var myObject = {};
for (var i = 0; i < inputs.length; i++) {
myObject["val"+i] = inputs[i];
}
您可以使用括号表示法作为对象的 property accessor 和获取输入元素的 getElementsByTagName
。
var inputs = document.getElementsByTagName('input'),
object = {};
function setValues() {
for (var i = 0; i < inputs.length; i++) {
object['val' + i] = inputs[i].value;
}
console.log(object);
}
<form onchange="setValues()">
<input type="text">
<input type="text">
<input type="text">
<input type="text">
</form>
我会这样写 Array.prototype.forEach():
const inputs = document.querySelectorAll('input')
const myObject = {}
inputs.forEach((element, index) => myObject[`val${index}`] = element)
这正是 Array.reduce() 函数的用途:
document.querySelector('button').addEventListener('click', function(e) {
var inputs = document.querySelectorAll('input');
var obj = [].reduce.call(inputs, (accumulator, currentValue, currentIndex) => {
accumulator[`val${currentIndex}`] = currentValue.value
return accumulator
}, {})
console.log(obj)
});
<form>
<input type="text">
<input type="text">
<input type="text">
<input type="text">
<button>Go</button>
</form>
你可以用一个表达式来完成:
var myObject = Object.assign(...
Array.from(document.getElementsByTagName('input'), (inp, i) => ({ ['val'+i]: inp }))
);
如果您想要输入中的 values(正如您在文中所说),那么您需要 inp.value
而不是右侧的 inp
表达式的一侧,或解构赋值:
var myObject = Object.assign(...Array.from(
document.getElementsByTagName('input'), ({value}, i) => ({ ['val'+i]: value })
));
console.log(myObject);
<input value="hello">
<input value="world">
遍历您的元素并动态使用索引:
a[`val${i}`] = e.value;
document.querySelector('button').addEventListener('click', function(e) {
e.preventDefault();
var inputs = document.querySelectorAll('input'),
myObject = Array.from(inputs).reduce(function(a, e, i) {
a[`val${i}`] = e.value;
return a;
}, {});
console.log(myObject)
});
<form>
<input type="text">
<input type="text">
<input type="text">
<input type="text">
<button>Click me!</button>
</form>
循环输入字段。可能是这样的:
let inputList = document.getElementsByTagName('input');
let val = 'val';
for (let x in inputList){
let name = val + x;
myObj.`${name}`= inputList[x].value;
number++;
}
只是众多选项中的一个。
总结
您似乎想要填充一个值数组
如果我理解正确的话,这应该可以回答你的问题
var inputs = document.getElementsByTagName('input'),
object = [];
function setValues() {
for (var i = 0; i < inputs.length; i++) {
object.push("val" + i + ": " + inputs[i].value );
}
console.log(object);
}
document.addEventListener("DOMContentLoaded", setValues(), false);
<form onchange="setValues()">
<input type="text" value="test">
<input type="text" value="test22">
<input type="text" value="test333">
<input type="text" value="test444">
</form>
我试图通过迭代输入然后将它们存储为对象数组中的 key/value 对来从表单中的多个输入字段收集值。但是,我正在努力寻找一种有效的方法来执行此操作,该方法不涉及长集 if if else 或 switch 语句。
概念:
<form>
<input type="text">
<input type="text">
<input type="text">
<input type="text">
</form>
我想避免的事情:
var inputs = document.querySelectorAll('input');
for (var i = 0; i < inputs.length; i++) {
var myObject = {};
if (i = 0) {
myObject.val0 = inputs[i];
} else if (i = 1) {
myObject.val1 = inputs[i];
} else if (i = 2) {
myObject.val2 = inputs[i];
} else if (i = 3) {
myObject.val3 = inputs[i];
}
}
关于如何更有效地完成这项工作有什么建议吗?我的一个想法是使用括号表示法根据现有的 html 元素属性(可能是 id、名称或自定义数据属性)动态设置键值。
为每个输入字段添加一个唯一的 id
(为您的对象指定一个键)。
<form>
<input id="firstName" type="text">
<input id="lastName" type="text">
<input id="email" type="email">
<input id="number" type="text">
</form>
现在保存id为key,value为value:
var inputs = document.querySelectorAll('input');
var myObject = {};
for (var i = 0; i < inputs.length; i++) {
myObject[inputs[i].id] = inputs[i].value;
}
console.log(myObject) // {firstName: "", lastName: "", email: "", number: ""}
将其全部转换为一个函数,其形式如下:
function getFormValues(formId) {
var inputs = document.querySelectorAll('#' + formId + ' input');
var formValues = {};
for (var i = 0; i < inputs.length; i++) {
formValues[inputs[i].id] = inputs[i].value;
}
return formValues;
}
总计:
<form id="registerForm">
<input id="firstName" type="text">
<input id="lastName" type="text">
<input id="email" type="email">
<input id="number" type="text">
</form>
getFormValues('registerForm'); // {firstName: "", lastName: "", email: "", number: ""}
现在您可以进一步扩展该函数,使其处理数组值等。
首先,您应该在 for 循环之外声明变量,否则您将在每次 for 循环运行时都声明。
此外,您可以使用括号表示法代替点表示法来实现这一点。
var myObject = {};
for (var i = 0; i < inputs.length; i++) {
myObject["val"+i] = inputs[i];
}
您可以使用括号表示法作为对象的 property accessor 和获取输入元素的 getElementsByTagName
。
var inputs = document.getElementsByTagName('input'),
object = {};
function setValues() {
for (var i = 0; i < inputs.length; i++) {
object['val' + i] = inputs[i].value;
}
console.log(object);
}
<form onchange="setValues()">
<input type="text">
<input type="text">
<input type="text">
<input type="text">
</form>
我会这样写 Array.prototype.forEach():
const inputs = document.querySelectorAll('input')
const myObject = {}
inputs.forEach((element, index) => myObject[`val${index}`] = element)
这正是 Array.reduce() 函数的用途:
document.querySelector('button').addEventListener('click', function(e) {
var inputs = document.querySelectorAll('input');
var obj = [].reduce.call(inputs, (accumulator, currentValue, currentIndex) => {
accumulator[`val${currentIndex}`] = currentValue.value
return accumulator
}, {})
console.log(obj)
});
<form>
<input type="text">
<input type="text">
<input type="text">
<input type="text">
<button>Go</button>
</form>
你可以用一个表达式来完成:
var myObject = Object.assign(...
Array.from(document.getElementsByTagName('input'), (inp, i) => ({ ['val'+i]: inp }))
);
如果您想要输入中的 values(正如您在文中所说),那么您需要 inp.value
而不是右侧的 inp
表达式的一侧,或解构赋值:
var myObject = Object.assign(...Array.from(
document.getElementsByTagName('input'), ({value}, i) => ({ ['val'+i]: value })
));
console.log(myObject);
<input value="hello">
<input value="world">
遍历您的元素并动态使用索引:
a[`val${i}`] = e.value;
document.querySelector('button').addEventListener('click', function(e) {
e.preventDefault();
var inputs = document.querySelectorAll('input'),
myObject = Array.from(inputs).reduce(function(a, e, i) {
a[`val${i}`] = e.value;
return a;
}, {});
console.log(myObject)
});
<form>
<input type="text">
<input type="text">
<input type="text">
<input type="text">
<button>Click me!</button>
</form>
循环输入字段。可能是这样的:
let inputList = document.getElementsByTagName('input');
let val = 'val';
for (let x in inputList){
let name = val + x;
myObj.`${name}`= inputList[x].value;
number++;
}
只是众多选项中的一个。
总结 您似乎想要填充一个值数组 如果我理解正确的话,这应该可以回答你的问题
var inputs = document.getElementsByTagName('input'),
object = [];
function setValues() {
for (var i = 0; i < inputs.length; i++) {
object.push("val" + i + ": " + inputs[i].value );
}
console.log(object);
}
document.addEventListener("DOMContentLoaded", setValues(), false);
<form onchange="setValues()">
<input type="text" value="test">
<input type="text" value="test22">
<input type="text" value="test333">
<input type="text" value="test444">
</form>