简体   繁体   English

从表单到关联数组检索数据

[英]retrieving data from form to associative array

could somebody tell me how to pass values from form to 2d associative array? 有人可以告诉我如何将值从表单传递到2d关联数组吗? I made simple associative array and it was easy to write it, but now I have problem with 2d array and getSalary() function. 我制作了简单的关联数组,编写起来很容易,但是现在我对二维数组和getSalary()函数有getSalary() getWorkload() works fine, but getSalary() doesn't work. getWorkload()可以正常工作,但是getSalary()无法正常工作。 I would be grateful for some tip or code modification. 我将不胜感激一些技巧或代码修改。

 var salaries = [ [ "mrWh", ["intern", 2511], ["contractual", 2592], ["designated", 2932], ["certificated", 3411] ], [ "mrbchWht", ["intern", 2121], ["contractual", 2200], ["designated", 2522], ["certificated", 3000] ], [ "bchWht", ["intern", 1868], ["contractual", 1910], ["designated", 2200], ["certificated", 2600] ] ]; var worklooad = []; worklooad["20"] = 20; worklooad["25"] = 25; worklooad["30"] = 30; worklooad["35"] = 35; function getSalary() { var slr = 0; var formData = document.forms["data"]; var selEdLvl = formData.elements["edLvl"]; var selDegree = formData.elements["degrees"]; slr = salaries[selEdLvl][selDegree.value]; return slr; } function getWorkload() { var psm = 0; var formularz = document.forms["data"]; var selPsm = formularz.elements["workload"]; psm = worklooad[selPsm.value]; return psm; } function chkEtat(pStr) { var spl44 = document.getElementById("spl44"); if (!isNaN(pStr) && pStr !== "" && pStr <= getWorkload()) { spl44.style.fontSize = "22px"; pStr = pStr / getWorkload(); spl44.innerHTML = pStr.toFixed(2) + "<br>"; return pStr; } else if (isNaN(pStr)) { spl44.style.fontSize = "18px"; spl44.innerHTML = "Enter number." + "<br>"; return 0; } else if (pStr > getWorkload()) { var spl44 = document.getElementById("spl44"); spl44.innerHTML = "inappropriate value." + "<br>"; return 0; } else { document.getElementById("spl44").innerHTML = ""; } } function calcpTime() { var str = document.getElementById("inppn"); var vStr = document.getElementById("inppn").value; var rpvStr = vStr.replace(/,/g, '.'); rpvStr = parseFloat(rpvStr); var cmp = /^\\d{1,2}$/.test(vStr); if (cmp === true) { var nStr = vStr.concat(".0"); document.getElementById("inppn").value = nStr; var fnStr = parseFloat(nStr); return chkEtat(fnStr); } return chkEtat(rpvStr); } function calcSalaries() { calcpTime(); document.getElementById("spl55").innerHTML = getSalary() * calcpTime(); } function clearInps() { document.getElementById("data").reset(); } 
 <form id="data"> <div> <label>Education level: </label> <select id="edLvl"> <option value="" selected disabled hidden>Select</option> <option value="mrWh">Master with pedagogical preparation</option> <option value="mrbchWht">Master without pedagogical preparation</option> <option value="mrbchWht">Bachelor with pedagogical preparation</option> <option value="bchWht">Bachelor without pedagogical preparation</option> </select> </div> <div> <label>Ascension degree: </label> <select id="degrees"> <option value="" selected disabled hidden>Select</option> <option value="intern">intern</option> <option value="contractual">contractual</option> <option value="designated">designated</option> <option value="certificated">certificated</option> </select> </div> <div> <label>Workload: </label> <select id="workload"> <option value="" selected disabled hidden>Select</option> <option value="20">20</option> <option value="25">25</option> <option value="30">30</option> <option value="35">35</option> </select> </div> <div> <label>Workload: </label> <input onchange="calcSalaries()" type=text id="inppn"> <span id="spl44"></span> </div> <div> <label>Salary: </label> <span id="spl55"></span> </div> <button id="clear" onclick="clearInps()">Clear data</button> </form> 

Use .find to identify particular elements in an array: 使用.find标识数组中的特定元素:

 var salaries = [ [ "mrWh", ["intern", 2511], ["contractual", 2592], ["designated", 2932], ["certificated", 3411] ], [ "mrbchWht", ["intern", 2121], ["contractual", 2200], ["designated", 2522], ["certificated", 3000] ], [ "bchWht", ["intern", 1868], ["contractual", 1910], ["designated", 2200], ["certificated", 2600] ] ]; document.querySelector('#data').addEventListener('submit', e => e.preventDefault()); function getSalary() { const edLvlVal = document.querySelector('#edLvl').value; const degreeVal = document.querySelector('#degrees').value; const salary = salaries .find(([level]) => level === edLvlVal) .find(([degree]) => degree === degreeVal); console.log('salary ' + salary); } 
 <form id="data"> <div> <label>Education level: </label> <select id="edLvl"> <option value="" selected disabled hidden>Select</option> <option value="mrWh">Master with pedagogical preparation</option> <option value="mrbchWht">Master without pedagogical preparation</option> <option value="mrbchWht">Bachelor with pedagogical preparation</option> <option value="bchWht">Bachelor without pedagogical preparation</option> </select> </div> <div> <label>Ascension degree: </label> <select id="degrees"> <option value="" selected disabled hidden>Select</option> <option value="intern">intern</option> <option value="contractual">contractual</option> <option value="designated">designated</option> <option value="certificated">certificated</option> </select> </div> <div> <label>Workload: </label> <select id="workload"> <option value="" selected disabled hidden>Select</option> <option value="20">20</option> <option value="25">25</option> <option value="30">30</option> <option value="35">35</option> </select> </div> <div> <label>Workload: </label> <input onchange="calcSalaries()" type=text id="inppn"> <span id="spl44"></span> </div> <div> <label>Salary: </label> <span id="spl55"></span> </div> <button onclick="getSalary()">Get Salary</button> <button id="clear" onclick="clearInps()">Clear data</button> </form> 

But your data structure is very difficult to deal with - you should use an object instead, so you can access by string keys, which is much simpler than .find . 但你的数据结构非常难以对付的-你应该使用对象来代替,这样你就可以通过字符串键,这比简单得多访问.find Use something like this instead: 使用类似这样的东西:

 const salaries = { mrWh: {intern: 2511, contractual: 2592, designated: 2932, certificated: 3411 }, mrbchWht: { intern: 2121, contractual: 2200, designated: 2522, certificated: 3000 }, bchWht: { intern: 1868, contractual: 1910, designated: 2200, certificated: 2600 } }; const prop1 = 'mrWh'; const prop2 = 'designated'; console.log(salaries[prop1][prop2]); 

I think your main issue is that you're missing .value in a couple of places. 我认为您的主要问题是在几个地方缺少.value For example: var selEdLvl = formData.elements["edLvl"]; 例如: var selEdLvl = formData.elements["edLvl"]; should probably be changed to var selEdLvl = formData.elements["edLvl"].value; 应该更改为var selEdLvl = formData.elements["edLvl"].value;

If you turn your salaries array into an "associative" one: 如果将薪水数组转换为“关联”数组:

var salaries_assoc = salaries
.reduce(function(ac,d,i){
    ac[d[0]]=d.slice(1)
    .reduce(function(ac,d,i){
        ac[d[0]]=d[1];return ac
    },{});
    return ac
},{});
/*"{
    "mrWh": {
        "intern": 2511,
        "contractual": 2592,
        "designated": 2932,
        "certificated": 3411
    },
    "mrbchWht": {
        "intern": 2121,
        "contractual": 2200,
        "designated": 2522,
        "certificated": 3000
    },
    "bchWht": {
        "intern": 1868,
        "contractual": 1910,
        "designated": 2200,
        "certificated": 2600
    }
}"*/

Now you can do this in your event (or in your getSalaries function etc): 现在,您可以在事件中(或在getSalaries函数等中)执行以下操作:

var value1 = document.getElementById("edLvl").value,//"mrWh"
    value2 = document.getElementById("degrees").value;//"intern"
salaries_assoc[value1] && salaries_assoc[value1][value2];//2511

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM