我按此顺序排列了一个数组
数组的原始顺序:
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
答案 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)
我会建议这些步骤:
这是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);