根据另一个数组对包含对象的数组进行排序

6
如果我有这样一个数组:

可能是重复问题:
JavaScript-根据另一个整数数组对数组进行排序
Javascript-根据另一个数组对数组进行排序

如果我有一个像这样的数组:

['one','four','two']

还有另一个类似于这样的数组:

[{
  key: 'one'
},{
  key: 'two'
},{
  key: 'four'
}]

我该如何对第二个数组进行排序,以便其key属性遵循第一个数组的顺序?在这种情况下,我希望得到以下结果:
[{
  key: 'one'
},{
  key: 'four'
},{
  key: 'two'
}]

@TedHopp 不完全正确,这解决了两个平面数组,但这种情况使用对象键使其更难有效地排序(除非您想在每次迭代中搜索第二个)。 - David Hellsing
我本以为这样做可以起作用,但是不知怎么的...它没有。 :-/a2.sort(function(a,b) { a1[a2.indexOf(a)] - a1[a2.indexOf(b)] }) - Frank van Puffelen
2个回答

6
我们可以使用sort()函数来实现这个目的,通过传递一个自定义函数进行比较。这个函数必须返回3个可能的值,给定要比较的ab
如果ab低,则返回-1 如果a被认为等于b,则返回0 如果ab高,则返回1 有了这个想法,我们可以定义一个如下的函数:
function sortFunction(a,b){
    var indexA = arr.indexOf(a['key']);
    var indexB = arr.indexOf(b['key']);
    if(indexA < indexB) {
        return -1;
    }else if(indexA > indexB) {
        return 1;
    }else{
        return 0;       
    }
}

这个函数将接收你在数组中定义的对象,并查找该值在arr数组中的位置,该数组是你要进行比较的数组。然后它会比较索引,并根据需要返回值。

我们通过将该函数传递到sort()函数中来使用它:

testArray.sort(sortFunction)

这里的testArray是你想要排序的数组。

你可以在这里看到我做的一个例子,在调用排序函数之前和之后,你可以看到数组中的第二个对象被“alerted”给你。http://jsfiddle.net/Sqys7/


好的,但是arr怎么办?我想按照arr的顺序排序。 - David Hellsing
1
在排序函数中,它正在按照arr的顺序进行排序,它从arr中获取索引并进行比较。 - MysticXG
太好了,我完全忘记了排序函数,谢谢分享 :) - Hyyan Abo Fakher

4
这是我的理解:
function orderArray(array_with_order, array_to_order) {
    var ordered_array = [], 
        len = array_to_order.length,
        len_copy = len,
        index, current;

    for (; len--;) {
        current = array_to_order[len];
        index = array_with_order.indexOf(current.key);
        ordered_array[index] = current;
    }

    //change the array
    Array.prototype.splice.apply(array_to_order, [0, len_copy].concat(ordered_array));
}

示例实现:

var array_with_order = ['one', 'four', 'two'],

    array_to_order = [
        {key: 'one'},
        {key: 'two'},
        {key: 'four'}
    ];

orderArray(array_with_order, array_to_order);

console.log(array_to_order); //logs [{key: 'one'}, {key: 'four'}, {key: 'two'}];

常见的操作: http://jsfiddle.net/joplomacedo/haqFH/

2
使用排序函数可能是更好的方法。 - João Paulo Macedo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接