如何将java脚本数组恢复到原始顺序

时间:2016-09-03 16:56:33

标签: javascript

我按此顺序排列了一个数组

数组的原始顺序:

var originalcolumns = [
                "es_officer_id",
                "es_officer_name",
                "es_officer_fname",
                "es_bps_title",
                "es_department_name",
                "es_bps_id",
                "es_department_id"
             ]

var sortedfirst = originalcolumns.sort();

排序后的sortedfirst数组看起来像

[
  "es_bps_id",
  "es_bps_title",
  "es_department_id",
  "es_department_name",
  "es_officer_fname",
  "es_officer_id",
  "es_officer_name"
]

数组的副本(剥离最后一个下划线后的值)

如果它返回true,我会将每个记录与下一个记录匹配,别名将与您在最终结果中看到的相同。

var withoutlast = [
              "es_bps",
              "es_bps",
              "es_department",
              "es_department",
              "es_officer",
              "es_officer",
              "es_officer"
            ]

var withoutlastsorted = withoutlast.sort(); 

1:了解我的表名是es_officer是至关重要的,所以第一个别名应该是es_officer_id,就像(a.es_officer_id)那样到目前为止无法正常工作,因为我按字母顺序对数组进行了排序。

2:相同的首字母必须具有相同的别名:a.es_officer_id将具有与a.es_officer_name相同的别名,在这种情况下我也会碰壁。如果我不对数组进行排序并添加别名,那么结果前3个结果具有相同的别名,因为它们是连续的。但是最后4个将有不同的别名,例如:b c,d,e

现在为数组中的每个项添加一些别名

var alias = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q',
                     'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'];

var AliasAddedCols = [];
var aliasIndex = 0;
var sameColIndex = 0;

for(var columnName in sortedfirst)
{
    AliasAddedCols.push(alias[aliasIndex] +'.'+sortedfirst[columnName]);
    if(withoutlast[sameColIndex] !== withoutlast[sameColIndex + 1])
    {
       aliasIndex ++;
    }
    sameColIndex++;
}

现在如果我控制AliasAddedCols,最终结果如下:

[
   "a.es_bps_id",
   "a.es_bps_title",
   "b.es_department_id",
   "b.es_department_name",
   "c.es_officer_fname",
   "c.es_officer_id",
   "c.es_officer_name"
]

唯一的问题是我需要最后一个数组的顺序“AliasAddedCols”与命令“原始数组”完全相同。

别名是从es_bps_id开始的,在我的情况下它是错误的,第一个别名“a”应该是前三列(es_officer_id,es_officer_name,es_officer_fname)第二个别名“b”应该是第4项和6(es_bps_title,es_bps_id)和第三个别名“c”应该与数组中的第5项和第7项一起使用(es_department_name,es_department_id

3 个答案:

答案 0 :(得分:1)

只需将原始数组存储为单独的值,然后您可以将其转换为您需要的值。

请注意class controller{ function getData(client $client = null){ if (is_null($client)) { $client = new client; } } } “就地”工作,这意味着您必须创建原始数组的副本。您可以使用Array.prototype.sort()或传播运算符var copy = myArray.slice()(ES2015 +)。

答案 1 :(得分:1)

我会建议这些步骤:

  1. 将每个字符串包裹在单个元素子数组中;
  2. 获取该数组的浅表副本;
  3. 按字符串部分排序该副本(与您一样);
  4. 根据您的逻辑添加前缀(与您一样);
  5. 步骤1的数组中元素的顺序没有改变,所以现在再次打开(替换)字符串。
  6. 这是ES6代码(但没有在函数参数中进行解构分配,因为您发现在您的环境中不支持):

    
    
    var columns = [
        "es_officer_id",
        "es_officer_name",
        "es_officer_fname",
        "es_bps_title",
        "es_department_name",
        "es_bps_id",
        "es_department_id"
    ];
    
    // 0. Define the table name, which should be sorted first
    var tablePrefix = 'es_officer_';
    // 1. Convert to array of arrays (to wrap the strings)
    columns = columns.map( (s, i) => [s] );
    // 2. Create a shallow copy
    columns.slice()
           // Sort that copy, but keep table name first 
           .sort( (a, b) => a[0].indexOf(tablePrefix) ? a[0].localeCompare(b[0]) : -1 )
           // Alter the strings according to your logic
           .reduce( (status, a) => {
                // Chop off last "_word"
                var base = a[0].replace(/_[^_]*$/, '');
                // When different than previous, increase counter
                if (status.prev !== base) status.charCode++;
                status.prev = base;
                // Prefix string with letter
                a[0] = String.fromCharCode(status.charCode) + '.' + a[0];
                // Pass status on to next iteration
                return status;
           }, { charCode: 'a'.charCodeAt(0)-1 } ); // set initial status
    // 3. `columns` still has the original order, now perform the 
    //    inverse of step 1, unwrapping the strings
    columns = columns.map( (a, i) => a[0] );
    
    console.log(columns);
    
    
    

答案 2 :(得分:1)

只需减少两次,您可以执行以下操作;



var columns = [
               "es_officer_id",
               "es_officer_name",
               "es_officer_fname",
               "es_bps_title",
               "es_department_name",
               "es_bps_id",
               "es_department_id"
             ];
    sorted = [
              "0.es_bps_id",
              "1.es_bps_title",
              "2.es_department_id",
              "3.es_department_name",
              "4.es_officer_fname",
              "5.es_officer_id",
              "6.es_officer_name"
             ],
            lut = columns.reduce((m,e,i) => (m[e] = i,m),{});
       restored = sorted.reduce((res,e) => (res[lut[e.split(/[0-9a-zA-Z]+\./)[1]]] = e,res) ,[]);
console.log(restored);