在JavaScript中基于多值特征重新组织多维数组?

在JavaScript中基于多值特征重新组织多维数组?,javascript,arrays,sorting,multidimensional-array,Javascript,Arrays,Sorting,Multidimensional Array,我无法按我希望的方式组织此数据。在我的网页上,发生了一些我知道是工作的事情 一些PHP抛出一个多维关联数组。此数组的顶层是一个区域数组。每个区域都是一组时区 还有一些PHP创建了第二个多维关联数组。此数组的顶层是一个区域数组。每个区域都是UTC偏移量的数组 两个数组都是从相同的数据以相同的顺序生成的。这意味着$offset[“region”][0]将基于与$timezones[“region”][0]相同的时区 这两个数组都被编码成JSON并传递给我的JavaScript 我有以下JavaScr

我无法按我希望的方式组织此数据。在我的网页上,发生了一些我知道是工作的事情

  • 一些PHP抛出一个多维关联数组。此数组的顶层是一个区域数组。每个区域都是一组时区
  • 还有一些PHP创建了第二个多维关联数组。此数组的顶层是一个区域数组。每个区域都是UTC偏移量的数组
  • 两个数组都是从相同的数据以相同的顺序生成的。这意味着
    $offset[“region”][0]
    将基于与
    $timezones[“region”][0]
    相同的时区
  • 这两个数组都被编码成JSON并传递给我的JavaScript
  • 我有以下JavaScript代码

    var tempCurrentTimezoneArray = timezoneArray[ $("select[name='region_selector']").val() ];
      var tempCurrentOffsetArray = timezoneOffsetArray[ $("select[name='region_selector']").val() ];
      var groupedTimezones = {};
      var groupedOffsets = {};
      for (counter = 0; counter < tempCurrentOffsetArray.length; counter++) { 
        significantOffset = tempCurrentOffsetArray[counter].substr(tempCurrentOffsetArray[counter].length - 2);
        if (!(significantOffset in groupedTimezones)) {
          groupedTimezones[significantOffset] = [];
          groupedOffsets[significantOffset] = [];
        }
        groupedTimezones[significantOffset].push(tempCurrentTimezoneArray[counter]);
        groupedOffsets[significantOffset].push(tempCurrentOffsetArray[counter]);    
      }
      var offsetArray = [];
      for (var property in groupedTimezones) {
        if (!groupedTimezones.hasOwnProperty(property)) {
            continue;
        }
        groupedTimezones[property].sort();
        groupedOffsets[property].sort();
        offsetArray.push(parseInt(property));
      }
      offsetArray.sort();
      var currentTimezoneArray = [];
      var currentOffsetArray = [];
      for (counter = 0; counter < offsetArray.length; counter++) {
        currentTimezoneArray = currentTimezoneArray.concat(groupedTimezones[offsetArray[counter]]);
        currentOffsetArray = currentOffsetArray.concat(groupedOffsets[offsetArray[counter]]);
      }
    
    var tempCurrentTimezoneArray=timezoneArray[$(“选择[name='region_selector'])。val();
    var tempCurrentOffsetArray=timezoneOffsetArray[$(“选择[name='region_selector'])).val();
    var groupedTimezones={};
    var groupedOffsets={};
    对于(计数器=0;计数器
    在上面的两行中,我删除了与页面上所选区域无关的所有时区数据。这意味着我剩下两个一维数组。任一数组的任何给定索引都直接与另一个数组相关。即

    tempCurrentOffsetArray[0]
    是在
    tempCurrentTimezoneArray[0]
    找到的时区的UTC偏移量

    此代码的其余部分用于完成以下任务

  • 按其UTC偏移对时区和偏移进行分组
  • 按字母顺序组织每个偏移组
  • 创建两个数组,其中值首先按UTC偏移量组织,其次按字母顺序组织
  • 我遇到的问题是,在一些地区,我收到了几乎完美的列表,而在其他地区,我收到了一些带有看似随机数目的未定义值的列表,我不知道为什么。有人能识别我代码中的语法或逻辑错误吗

    tempCurrentTimezoneArray
    输入数据的JSON

    tempCurrentOffsetArray的JSON
    输入数据

    我发现了代码的问题。实际上有三个问题,第一个在第6行。在再次查看数据之后,我意识到一些值的偏移量是浮点整数或有两个以上的有效数字。新的6号线是

    significantOffset = tempCurrentOffsetArray[counter].replace(/[^\d.-]/g, '');
    
    我的代码的第二个问题也与分析浮点整数有关。在第21行,我们需要使用
    parseFloat
    而不是
    parseInt
    。新的21号线是

    offsetArray.push(parseFloat(property));
    
    第三个问题在第23行<代码>排序()需要被告知如何对整数进行排序。这是新线23

    offsetArray.sort(function(a, b){return a-b});
    
    最后的代码如下所示

    var tempCurrentTimezoneArray = timezoneArray[ $("select[name='region_selector']").val() ];
        var tempCurrentOffsetArray = timezoneOffsetArray[ $("select[name='region_selector']").val() ];
        var groupedTimezones = {};
        var groupedOffsets = {};
        for (counter = 0; counter < tempCurrentOffsetArray.length; counter++) { 
          significantOffset = tempCurrentOffsetArray[counter].replace(/[^\d.-]/g, '');
          if (!(significantOffset in groupedTimezones)) {
        groupedTimezones[significantOffset] = [];
        groupedOffsets[significantOffset] = [];
          }
          groupedTimezones[significantOffset].push(tempCurrentTimezoneArray[counter]);
          groupedOffsets[significantOffset].push(tempCurrentOffsetArray[counter]);    
        }
        var offsetArray = [];
        for (var property in groupedTimezones) {
          if (!groupedTimezones.hasOwnProperty(property)) {
          continue;
          }
          groupedTimezones[property].sort();
          groupedOffsets[property].sort();
          offsetArray.push(parseFloat(property));
        }
        offsetArray.sort(function(a, b){return a-b});
        var currentTimezoneArray = [];
        var currentOffsetArray = [];
        for (counter = 0; counter < offsetArray.length; counter++) {
          currentTimezoneArray = currentTimezoneArray.concat(groupedTimezones[offsetArray[counter]]);
          currentOffsetArray = currentOffsetArray.concat(groupedOffsets[offsetArray[counter]]);
        }
    
    var tempCurrentTimezoneArray=timezoneArray[$(“选择[name='region_selector'])。val();
    var tempCurrentOffsetArray=timezoneOffsetArray[$(“选择[name='region_selector'])).val();
    var groupedTimezones={};
    var groupedOffsets={};
    对于(计数器=0;计数器
    我发现我的代码有问题。实际上有三个问题,第一个在第6行。在再次查看数据之后,我意识到一些值的偏移量是浮点整数或有两个以上的有效数字。新的6号线是

    significantOffset = tempCurrentOffsetArray[counter].replace(/[^\d.-]/g, '');
    
    我的代码的第二个问题也与分析浮点整数有关。在第21行,我们需要使用
    parseFloat
    而不是
    parseInt
    。新的21号线是

    offsetArray.push(parseFloat(property));
    
    第三个问题在第23行<代码>排序()需要被告知如何对整数进行排序。这是新线23

    offsetArray.sort(function(a, b){return a-b});
    
    最后的代码外观
    SELECT timezone FROM data WHERE offset = "GMT-5"