根据不同长度的另一个数组中的值对数组进行排序

Sort an array based on values from another array of different length

本文关键字:数组 排序 另一个      更新时间:2023-09-26

我浏览了几篇有类似问题的帖子,但找不到一篇能解决我的问题的。其他的似乎都在使用另一个相同大小或按值的数组进行排序。

我有两个阵列,看起来像这样:

var allCategories = ['Campus', 'Building', 'Floor', 'Room', 'Lecture Theatre', 'Lab'];
var currentCategories = ['Room', 'Lab', 'Campus'];

如何对currentCategories进行排序,使其顺序与allCategories的顺序匹配?

所需输出:

currentCategories --> ['Campus', 'Room', 'Lab'];

"根据数组中元素的索引对该数组进行排序":

currentCategories.sort(function(a, b) {
  return allCategories.indexOf(a) - allCategories.indexOf(b);
});
// => ["Campus", "Room", "Lab"]

如果您只需要allCategories顺序currentCategories的成员,您可以执行以下操作。

allCategories.filter(function(x){return currentCategories.indexOf(x) != -1})

这假设您将每个array视为一组不重复的元素。如注释中所述,此方法可能会从最终值中删除重复元素,或者不按照您可能想要的方式对重复元素进行排序。

Array.Sort方法可以提供自定义函数。你可以这样做:

currentCategories.sort(function(a, b) {
    var i = allCategories.indexOf(a),
        j = allCategories.indexOf(b);           
    return i - j;
});

我还没有检查currentCategories中存在不在allCategories中的值时的行为。但是,如果是这样的话,它就不会名副其实了。

如果这是一种常见的情况,你可以按照以下几条线来概括它:

function sortByList(list) {
    return function (a, b) { return list.indexOf(a) - list.indexOf(b); };
}

这样称呼它:

currentCategories.sort(sortByList(allCategories));