我有两个数组,我希望第一个数组按我的第二个数组中的值排序。我的问题是我的第一个数组的元素是一个字符串,我的第二个数组只是整数。我想要实现的数组必须具有到最高时间的最短时间
第一个阵列:
[
'<tr data-time="1437513780"><td>test01</td>',
'<tr data-time="1435779420"><td>test02</td>',
'<tr data-time="1438316400"><td>test03</td>'
]
第二阵列:
[
1435779420,
1437513780,
1438316400
]
我想要实现的数组:
[
'<tr data-time="1435779420"><td>test02</td>',
'<tr data-time="1437513780"><td>test01</td>',
'<tr data-time="1438316400"><td>test03</td>'
]
编辑:我需要的是一个基于第二个数组的值的新数组,但它在第一个数组中看起来相同!
答案 0 :(得分:2)
如果我理解正确,您不必根据第二个阵列进行排序。只需提取数字并按它们排序。
var r = /\d+/;
var arrToSort = ['<tr data-time="1437513780"><td>test01</td>', '<tr data-time="1435779420"><td>test02</td>', '<tr data-time="1438316400"><td>test03</td>'];
sortedArr = arrToSort.sort(function(a, b) { return a.match(r) - b.match(r); })
答案 1 :(得分:1)
似乎是这样的:
var a = ['<tr data-time="1437513780"><td>test01</td>', '<tr data-time="1435779420"><td>test02</td>', '<tr data-time="1438316400"><td>test03</td>'];
var b = [1435779420, 1437513780, 1438316400];
var res = a.map(function(x, i) { return { val:x, key:b[i] } })
.sort(function(x, y) { return (x.key>y.key) - (x.key<y.key) })
.map(function(x) { return x.val });
但是第一个数组中data-time
的顺序不同,问题中第二个数组的值不同。
如果您需要根据第二个数组重新排序第一个数组:
var a = ['<tr data-time="1437513780"><td>test01</td>', '<tr data-time="1435779420"><td>test02</td>', '<tr data-time="1438316400"><td>test03</td>'];
var b = [1435779420, 1437513780, 1438316400];
var temp = {};
for (var q=0; q<a.length; ++q) {
var match = a[q].match(/\bdata-time=(["']?)(\d+)\1/);
temp[match ? match[2] : ""] = a[q];
}
var res = b.map(function(x) { return temp[x] });
// Test: compare res with version from the question:
res == "" + ['<tr data-time="1435779420"><td>test02</td>', '<tr data-time="1437513780"><td>test01</td>', '<tr data-time="1438316400"><td>test03</td>']
答案 2 :(得分:1)
由于JavaScript的自然数组排序从低到高,您可以使用数组的默认排序函数,如下所示:
['<tr data-time="1437513780"><td>test01</td>', '<tr data-time="1435779420"><td>test02</td>', '<tr data-time="1438316400"><td>test03</td>'].sort()
但是,请记住,仅当您对阵列中的所有元素使用相同的模板时才会起作用,并且日期时间数字总是10位数。否则,您需要使用自定义排序功能。
答案 3 :(得分:0)
您实际上并不需要第二个阵列。您具有要在第一个数组的字符串中排序的值。相反,你可以利用javascript的内置Array.sort
函数接受函数比较的事实。您可以使用它来自定义排序行为。
该函数接受两个参数,两个值被排序。如果第一个值是“大于”第二个值,则该函数应返回一个正数。如果第一个值是“小于”第二个值,则该函数应返回一个负数。如果它们相等,则返回0.
要做到这一点:
array.sort(function(element1, element2){
var num1 = parseInt(element1.match(/data-time="(\d+)"/)[1]);
var num2 = parseInt(element2.match(/data-time="(\d+)"/)[1]);
if(num1 > num2)
return 1;
if(num1 < num2)
return -1;
return 0;
});
正则表达式匹配data-time =“(数字)”,而index1匹配正则表达式匹配组中的数字。 parseInt函数会将这些转换为数字。然后,我们可以使用这些数字来创建正常的排序行为。
编辑:如果您需要根据第一阵列中已有的顺序进行排序,则需要稍作修改。您需要在第二个数组中找到数字的索引。
array.sort(function(element1, element2){
var num1 = parseInt(element1.match(/data-time="(\d+)"/)[1]);
var num2 = parseInt(element2.match(/data-time="(\d+)"/)[1]);
num1 = array2.indexOf(num1);
num2 = array2.indexOf(num2);
if(num1 > num2)
return 1;
if(num1 < num2)
return -1;
return 0;
});