javascript - 以相同的方式对两个数组进行排序

标签 javascript

例如,如果我有这些数组:

var name = ["Bob","Tom","Larry"];
var age =  ["10", "20", "30"];

然后我使用 name.sort(),“name”数组的顺序变为:

var name = ["Bob","Larry","Tom"];

但是,我怎样才能对“name”数组进行排序并使“age”数组保持相同的顺序呢?像这样:

var name = ["Bob","Larry","Tom"];
var age =  ["10", "30", "20"];

最佳答案

您可以对现有数组进行排序,或重新组织数据。

方法一: 要使用现有数组,您可以组合、排序和分离它们: (假设等长数组)

var names = ["Bob","Tom","Larry"];
var ages =  ["10", "20", "30"];

//1) combine the arrays:
var list = [];
for (var j = 0; j < names.length; j++) 
    list.push({'name': names[j], 'age': ages[j]});

//2) sort:
list.sort(function(a, b) {
    return ((a.name < b.name) ? -1 : ((a.name == b.name) ? 0 : 1));
    //Sort could be modified to, for example, sort on the age 
    // if the name is the same.
});

//3) separate them back out:
for (var k = 0; k < list.length; k++) {
    names[k] = list[k].name;
    ages[k] = list[k].age;
}

这具有不依赖字符串解析技术的优点,并且可以用于需要一起排序的任意数量的数组。

方法 2: 或者您可以稍微重新组织数据,只对对象集合进行排序:

var list = [
    {name: "Bob", age: 10}, 
    {name: "Tom", age: 20},
    {name: "Larry", age: 30}
    ];

list.sort(function(a, b) {
    return ((a.name < b.name) ? -1 : ((a.name == b.name) ? 0 : 1));
});

for (var i = 0; i<list.length; i++) {
    alert(list[i].name + ", " + list[i].age);
}
​

对于比较,-1 表示较低的索引,0 表示相等,1 表示较高的索引。值得注意的是 sort() 实际上改变了底层数组。

另外值得注意的是,方法 2 更有效,因为除了排序之外,您不必遍历整个列表两次。

http://jsfiddle.net/ghBn7/38/

关于javascript - 以相同的方式对两个数组进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11499268/

相关文章:

Javascript/jQuery 设置时间延迟,从 DOM 中弹出底部元素

php - 多复选框,可以选中所有和取消选中所有

javascript - google geochart 标记大小和颜色

javascript - 如何关闭 React Bootstrap Carousel 的自动播放?

php - 从回显的 php 传递数据

javascript - 我正在尝试根据它们的 id 在 html 中订购 div

javascript - jQuery 组合多个元素

javascript - 没有图像的元素上的 CSS 掩码?

javascript - 阻止嵌入式 iframe 重定向

javascript - AngularJS Toaster 在回调时不显示