对包含字符串、日期和数字的数组进行排序
Sorting an array which contains string, date and number
var myArray = [
'_aaaa_2013-09-25_ssss9.txt',
'_aaaa_2013-09-25_ssss8.txt',
'_aaaa_2013-09-26_ssss1.txt',
'_aaaa_2013-09-25_ssss10.txt',
'_aaaa_2013-09-26_ssss2.txt',
'_aaaa_2013-09-25_ssss13.txt',
'_aaaa_2013-09-25_ssss5.txt',
'_aaaa_2013-09-25_ssss6.txt',
'_aaaa_2013-09-25_ssss7.txt'
];
我需要按日期和数字对数组进行排序。
结果应该是
var result = [
'_aaaa_2013-09-25_ssss5.txt',
'_aaaa_2013-09-25_ssss6.txt',
'_aaaa_2013-09-25_ssss7.txt',
'_aaaa_2013-09-25_ssss8.txt',
'_aaaa_2013-09-25_ssss9.txt',
'_aaaa_2013-09-25_ssss13.txt',
'_aaaa_2013-09-26_ssss1.txt',
'_aaaa_2013-09-26_ssss2.txt'
];
我已经尝试了下面的代码,这将仅按日期排序,但我需要按".txt"之前的数字排序。我该怎么做。
myArray.sort(function (a, b) {
var timeStamp1 = a.substring(a.indexOf('_aaaa') + 6, a.indexOf('_ssss'));
var timeStamp2 = b.substring(b.indexOf('_aaaa') + 6, b.indexOf('_ssss'));
timeStamp1 = new Date(Date.UTC(timeStamp1[0], timeStamp1[1], timeStamp1[2]));
timeStamp2 = new Date(Date.UTC(timeStamp2[0], timeStamp2[1], timeStamp2[2]));
return (timeStamp1 > timeStamp2) ? 1 : (timeStamp2 > timeStamp1 ? -1 : 0);
});
你可以这样做:
var re = /^_aaaa_('d'd'd'd-'d'd-'d'd)_ssss('d+)'.txt$/;
var result = myArray.slice().sort( function( a, b ) {
var aa = a.match(re), bb = b.match(re);
return(
aa[1] < bb[1] ? -1 :
aa[1] > bb[1] ? 1 :
aa[2] - bb[2]
);
});
请注意使用 .slice()
创建数组的副本。如果要就地对原始数组进行排序,可以省略此操作。(感谢@DerFlatulator提醒!
这对
我有用。
myArray.sort(function (a, b) {
var a_s = a.substring(0, a.indexOf('ssss') + 4);
var a_n = a.substring(a.indexOf('ssss') + 4, a.indexOf('.txt'));
var b_s = b.substring(0, b.indexOf('ssss') + 4);
var b_n = b.substring(b.indexOf('ssss') + 4, b.indexOf('.txt'));
if (a_s < b_s)
return -1;
if (a_s > b_s)
return 1;
return parseInt(a_n) - parseInt(b_n);
});
js小提琴
按字符串中的数值排序。
这假设:
- 数字是整数
- 每个字符串都是不同的
- 日期可以按数字排序(年,月,日)
["aa_123","aa_13","aa_2","aa_22_bb_23","aa_22_bb_3"].sort( function ( a , b ) {
var as = a.split(/([0-9]+)/); // splits string retaining separators
var bs = b.split(/([0-9]+)/);
var i,c = Math.min(as.length,bs.length);
for ( i=0;i<c && as[i]===bs[i];++i ) ;
var an = (i&1)?+as[i]:as[i]; // separators (digits) always at odd index
var bn = (i&1)?+bs[i]:bs[i];
return (an<bn)?-1:1; // assumes every string different
} );
结果:
[
"aa_2",
"aa_13",
"aa_22_bb_3",
"aa_22_bb_23",
"aa_123"
]
这从给定的字符串中提取数字,并为每个数字部分添加给定的权重。因此,您可以按任何顺序对它进行排序,并具有计数,日,月,年的给定优先级。
function weightedNumSort(myArray,weightNum,weightString) {
var WEIGHTS_NUM = weightNum || [1,2,4,3]; //[YEAR,MONTH,DAY,COUNT], You can pass an array with appropriate weights for the number at the given position in the text, e.g year is the first Number
var WEIGHT_STRING = weightString || 1; //And a weight for the string value. If none get passed, default weights are used
function weightedSum (a,b,i) {
return ( a + b * ( WEIGHTS_NUM [i-1] || 1 ));
}
myArray = myArray.slice().sort(function (a, b) {
var reg = /('d+)/g //A regex to extract the numerical part
var lNum = a.match(reg) //Extract the numerical parts we now have an array ["2013","09","26","2"]
var rNum = b.match(reg)
var delta = Array.apply(null,{length:lNum.length+1});
delta [0] = 0; //add a 0 at the beginning, for convenience with the reduce function
for (var i=0,j=lNum.length; i < j; i++) {
var value = lNum[i] - rNum[i];
value = ~~ (value / Math.abs (value)) // 1 for positive values, 0 for 0 , -1 for negative values, to make weighting easier
delta[i+1] = value;
}
var weightedNumValue = delta.reduce (weightedSum) //Put a weight on the number parts.
var weightedStrValue = WEIGHT_STRING * ( a > b ? 1 : a < b ? -1 : 0 )
return weightedNumValue + weightedStrValue //Add the weighted values and we have a positive or negative value with a correct weight on the numerical parts
})
return myArray
}
输出
console.log (
weightedNumSort (myArray)
) /*
[
"_aaaa_2013-09-25_ssss5.txt",
"_aaaa_2013-09-25_ssss6.txt",
"_aaaa_2013-09-25_ssss7.txt",
"_aaaa_2013-09-25_ssss8.txt",
"_aaaa_2013-09-25_ssss9.txt",
"_aaaa_2013-09-25_ssss10.txt",
"_aaaa_2013-09-25_ssss13.txt",
"_aaaa_2013-09-26_ssss1.txt",
"_aaaa_2013-09-26_ssss2.txt"
]*/
和小提琴
相关文章:
- JavaScript数组排序(函数)用于对表行进行排序,而不是排序
- Javascript中的多维数组排序索引问题
- 如何按日期对Javascript对象数组排序
- 数组排序后显示更改
- 当许多元素相等时,Javascript数组排序无法正常工作
- Javascript数组排序速度受字符串长度的影响
- 按唯一键将对象数组排序为数组
- 以 js 为单位的数组排序
- js 数组排序无法正常工作
- 数组排序.论点从何而来
- 不需要的数组排序
- 数组排序不正确/不可预测,使用 indexOf 时
- Javascript将数组排序到树中
- 随后的多维数组排序会产生意外的结果
- 数组排序基于纯javascript搜索文本匹配
- Javascript自定义数组按数组排序
- 使用字符串按属性错误对对象进行数组排序
- 多维数组排序
- JavaScript与PHP在数组排序中的对比
- Javascript-关联数组排序