如何根据javascript中另一个数组的值对数组进行排序

时间:2015-07-06 17:03:40

标签: javascript arrays

我有两个数组,我希望第一个数组按我的第二个数组中的值排序。我的问题是我的第一个数组的元素是一个字符串,我的第二个数组只是整数。我想要实现的数组必须具有到最高时间的最短时间

第一个阵列:

[
 '<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>'
]

编辑:我需要的是一个基于第二个数组的值的新数组,但它在第一个数组中看起来相同!

4 个答案:

答案 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;
});