【问题标题】:Sort array containing objects based on another array [duplicate]基于另一个数组对包含对象的数组进行排序[重复]
【发布时间】:2012-11-22 18:30:21
【问题描述】:

可能重复:
JavaScript - Sort an array based on another array of integers
Javascript - sort array based on another array

如果我有这样的数组:

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

还有一个这样的数组:

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

如何对第二个数组进行排序,使其 key 属性遵循第一个数组的顺序?在这种情况下,我想要:

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

【问题讨论】:

标签: javascript arrays sorting


【解决方案1】:

我们可以使用 sort() 函数来执行此操作,方法是向它传递一个进行比较的自定义函数。该函数必须返回给定ab 的3 个可能值以进行比较:

return -1 如果a 的索引低于b

return 0 如果a 被认为等于b

return 1 如果a 的索引大于b

考虑到这一点,我们可以定义如下函数:

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 是您要排序的数组。

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

【讨论】:

  • 好的,但是arr 呢?我想按照arr的顺序排序。
  • 按arr顺序排序,排序函数中,取arr的索引,并进行比较。
  • 完美,我完全忘记了排序功能,谢谢分享:)
【解决方案2】:

这是我的看法:

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/

【讨论】:

  • 使用排序功能可能是更好的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-08
  • 1970-01-01
  • 2016-06-28
  • 2019-06-11
  • 1970-01-01
  • 2017-09-12
相关资源
最近更新 更多