使用jQuery,XML,JSON,JS遍历一个表

对不起,误导性的标题,但我不确定如何写它。

我有下面的表格......

在这里输入图像描述

我想制作一个简单的计算器,比较2个给定参数中的所有数据。

我会要求我的用户先选择一个国家,然后在该列中选择一个值。 做完这些之后,您可以提交表单,并从该行输出正确的值。

我做了一个小提琴试图展现我的意思......

http://jsfiddle.net/SLCaN/2/

做这个的最好方式是什么? 我知道的唯一方法是拥有一个巨大的if / else语句,这将使我永远写作。

$('.country').on('change', function(){
// If USA show corrent dropdown
if( $(this).val() == 'usa'){
    $('.hiddenGrade').hide();
    $('.iniValusa').show();
} else if( $(this).val() == 'gb'){
    $('.hiddenGrade').hide();
    $('.iniValgb').show();
} else {
    $('.hiddenGrade').hide();
    $('.iniValfr').show();
}
});

$('input[type="submit"]').on('click', function(e){
    e.preventDefault();
    $('p').text('Values output here');
});

如果你选择French5a+你会在输出中得到5.8 and V-Diff ...


这样做肯定有不同的方式,但在我看来,这归结于数据结构。 我个人的看法是采用具有一系列等级国家的数据结构。 然后,这些成绩实际上是成对的(显示值/实际值),以说明数据中的差距。 这里的诀窍是我们不想在select中显示空的显示值,但我们确实需要用于转换的数据(实际值)。 之后,jQuery的东西很简单。

像这样的数据:

var countryGrades = [
    { country : "France", grades : [ 
        ["4", "4"], 
        ["", "4"], 
        ["5a", "5a"], 
        ["5a+", "5a+"], 
        ["5b", "5b"],
        ["5b+", "5b+"], 
        ["5c", "5c"],
        ["5c+", "5c+"],
        ["6a", "6a"],
        ["6a+", "6a+"],
        ["6b", "6b"] 
    ]},
    { country : "USA", grades : [ 
        ["5.6", "5.6"], 
        ["", "5.6"], 
        ["5.7", "5.7"], 
        ["", "5.7"], 
        ["5.8", "5.8"], 
        ["", "5.8"], 
        ["5.9", "5.9"], 
        ["5.10a", "5.10a"], 
        ["5.10b", "5.10b"], 
        ["5.10c", "5.10c"], 
        ["5.10d", "5.10d"]
    ]},
    { country : "UK", grades : [ 
        ["", ""], 
        ["Mod", "Mod"], 
        ["Diff", "Diff"], 
        ["V-Diff", "V-Diff"], 
        ["4a", "4a"], 
        ["4b", "4b"], 
        ["4b VS", "4b VS"], 
        ["4c HVS", "4c HVS"], 
        ["5a E1", "5a E1"], 
        ["", ""], 
        ["", ""]
    ]}
];

事件处理等是这样的:

function loadGrades(countryGradesIndex) {
    var gradeSelect = $("#grade");
    gradeSelect.empty();        
    $.each(countryGrades[countryGradesIndex].grades, function(index, grade) {
        if (grade[0] != "") {
            gradeSelect.append($("<option></option>").attr("value", index).text(grade[0]));
        }           
    });
}

$.each(countryGrades, function(index, countryGrade) {       
    $("#country").append($("<option></option>").attr("value", index).text(countryGrade.country));
});

$("#country").on("change", function() {
    loadGrades($("#country").val());
});

loadGrades(0);

$("#convert").on("click", function() {
    var gradeIndex = $("#grade").val();
    var gradeConversion = "";
    $.each(countryGrades, function(countryGradesIndex) {
        gradeConversion += countryGrades[countryGradesIndex].country + ": " + countryGrades[countryGradesIndex].grades[gradeIndex][1] + "<br>";
    });

    $("#conversions").html(gradeConversion);
});

在这里查看一个可用的JSFiddle:http://jsfiddle.net/tetonraven/SVj63/


Iserni的答案非常接近您的需求,我认为他们错过了输出部分,除非我正在阅读/理解错误的代码。

为了适应这个答案,我会改变数据结构为:

var grades = [
{'fr': "4", 'usa': "5.6",'gb': ""},
{'fr': "4", 'usa': "5.6",'gb': "Mod"},
{'fr': "5a",    'usa': "5.7",'gb': "Diff"},
{'fr': "5a+",   'usa': "5.7",'gb': "V-Diff"},
{'fr': "5b",    'usa': "5.8",'gb': "4a"},
{'fr': "5b+",   'usa': "5.8",'gb': "4b"},
{'fr': "5c",    'usa': "5.9",'gb': "4b VS"},
{'fr': "5c+",   'usa': "5.10a",'gb': "4c HVS"},
{'fr': "6a",    'usa': "5.10b",'gb': "5a E1"},
{'fr': "6a+",   'usa': "5.10c",'gb': ""},
{'fr': "6b",    'usa': "5.10d",'gb': ""}];

然后在你的点击事件中,像这样的东西会让你获得翻译的值(你需要适应一下)

$('input[type="submit"]').on('click', function(e){
   e.preventDefault();
   var matches = $.grep(grades,function(e) {
     return e[$(".country").val()] == $('.iniValusa').val()
   });

   if(matches.length == 1)
   {
     $('p').text('USA: ' + matches[0].usa + ' GB: ' + matches[0].gb + 'FR: ' + matches[0].fr);
   } 
});

暗恋的解决方案对我来说似乎是最实际的。 您可以在单个变量中定义数据,然后使用它来填充两个SELECT。 但是,考虑到迈克尔的解决方案可以适应更好的降级:如果Javascript被禁用,我会采取暗恋的解决方案,为您提供一个空白页面。

您将所有数据都保存在一个Javascript对象中,并且这些值被编入索引,以便相同的等级具有相同的索引(表中的行号):

 4: "quatrième valeur pour les français",
 ...
 4: "Fourth value for UK",

这种方法可以更容易地“翻译”(我相信)一个数组到另一个数组,即您选择法国,获得等级5b,将法国更改为美国:数值保持不变,这意味着显示的等级更改为相应的值在新的国家。

另外,您将所有数据保存在一个地方。

对于大型国家数组,我建议将grades[countryCode]转换成AJAX调用,以从服务器获取特定国家/地区。 您还需要另一个AJAX调用才能从服务器获取代码。

  var grades = {
    fr: {
        name: 'France',
        values: {
            0: "4",
            1: "4",
            2: "5a",
            3: "5a+",
            4: "5b",
            5: "5b+",
            6: "5c",
            7: "5c+",
            8: "6a",
            9: "6a+",
           10: "6b"
        }
     },
 us:    {
        name: 'USA',
        values: {
            0: "5.6",
            1: "5.6",
            2: "5.7",
            3: "5.7",
            4: "5.8",
            5: "5.8",
            6: "5.9",
            7: "5.10a",
            8: "5.10b",
            9: "5.10c",
           10: "5.10d"
        }
    },
'gb': {
        name: 'UK',
        values: {
            0: "",
            1: "Mod",
            2: "Diff",
            3: "V-Diff",
            4: "4a",
            5: "4b",
            6: "4b VS",
            7: "4c HVS",
            8: "5a E1",
            9: "",
           10: ""
        }
  }
}


  function setSelectTo(country) {
      // TODO: verify that country is indeed in grades
      var data = grades[country].values;
      var $el = $("#gradeSelect");
      $cur = $el.val();
      $el.empty();
      $.each(data, function(value, text) {
          $el
             .append($("<option></option>")
             .attr("value", value)
             .text(text));
      });
      // Restore value
      $el.val($cur);
  }
  function populateCountrySelect() {
      var $el = $("#countrySelect");
      $el.empty();

      $.each(grades, function(code, data) {
          $el
             .append($("<option></option>")
             .attr("value", code)
             .text(data.name));
      });
  }

  $('#countrySelect').on('change', function(){
      setSelectTo($(this).val());
  });

  populateCountrySelect();
  $('#countrySelect').val('us');
  setSelectTo('us');
  $('#gradeSelect').val(2);

这是一个更新的示例小提琴 - 抱歉,第一个URL是错误的 - 并且HTML非常小:

Choose your country: <select id="countrySelect"></select>
<br />
Choose your grade: <select id="gradeSelect"></select>            
链接地址: http://www.djcxy.com/p/19169.html

上一篇: Traverse a table using jQuery, XML, JSON, JS

下一篇: pandas dtype conversion from object to string