代码之家  ›  专栏  ›  技术社区  ›  MKF

排序嵌套数组

  •  2
  • MKF  · 技术社区  · 7 年前

    我使用javascript对嵌套数组进行排序。正如我所期望的那样:

    arr = [[223, "VA", "BP8"], [24, "VA", "BP31"], [127, "VA", "BP1"]]
    
    arr.sort(function(a,b){
        return a[2] > b[2];
    });
    
    //[[127, "VA", "BP1"], [24, "VA", "BP31"], [223, "VA", "BP8"]]
    

    但当我在浏览器中使用更多数据执行此操作时,在执行 sort 功能。它和打电话前一样 分类 .你知道这里怎么了吗?上面的示例是在下面的示例中被排序的确切数据,每个嵌套数组的长度都比较长,有更多的数据被推送到其中。

    tableData = [];
    arrayUtil.forEach(event.features, function (feature) {
        var rowData = [];
        rowData.push(feature.attributes.OBJECTID);
        rowData.push(feature.attributes.StateID);
        rowData.push(feature.attributes.Point);
        rowData.push(feature.attributes.PatchNum);
        rowData.push(developed(feature.attributes.IsDeveloped));
        rowData.push(cropType(feature.attributes.CropTypeID));
        rowData.push(feature.attributes.CropResidue);
        rowData.push(feature.attributes.CnpyOver12);
        rowData.push(feature.attributes.CnpyDecid);
        rowData.push(feature.attributes.CnpyConif);
        rowData.push(feature.attributes.ShrubCover);
        rowData.push(feature.attributes.ShbHiStemsDens);
        rowData.push(feature.attributes.GrassCover);
        rowData.push(feature.attributes.ForbCover);
        rowData.push(feature.attributes.FrbAsProtect);
        rowData.push(feature.attributes.ForbSpecies);
        rowData.push(feature.attributes.BareGround);
        rowData.push(herbHght(feature.attributes.HerbHeight));
        var overstoryDesc = coarseClassify(feature.attributes.Overstory);
        rowData.push(overstoryDesc);
        rowData.push(fineClassify(feature.attributes.Understory, overstoryDesc));
        rowData.push(qhStatus(feature.attributes.OfficialQH));
        rowData.push(formatDate(feature.attributes.ObsvDate));
        rowData.push(collectionType(feature.attributes.ObsvType));
        tableData.push(rowData);
    });
    
    //Sort the tableData list of lists by Point name
    tableData.sort(function (a, b) {
        return a[2] > b[2];
    });
    
    1 回复  |  直到 7 年前
        1
  •  3
  •   Pointy    7 年前

    回调函数 .sort() 应该返回 ,不是布尔值。数字应该小于零表示这两个值已经按正确的顺序排列,或者大于零表示它们处于相反的顺序,或者大于零表示它们相等。

    所以你想要的是

    tableData.sort(function(a, b) {
      return a[2].localeCompare(b[2]);
    });
    

    .localeCompare() 函数的作用与排序比较器的作用完全相同。但是,您可能会看到较旧的基于字符串的比较器函数执行以下操作:

    tableData.sort(function(a, b) {
      if (a < b) return -1;
      if (a > b) return 1;
      return 0;
    });
    

    更为明确。

    编辑 –现在我重新检查了问题中的原始代码,可能是您想要排序 颠倒 那把钥匙的顺序。如果是这样的话,你可以直接取消 .localecompare() 或比较 b a 而不是 是的。