根据预定义的顺序在{Javascript}中对数组进行排序

时间:2015-11-02 07:15:50

标签: javascript arrays sorting

我有一个数组:

var homes = [{
    "h_id": "3",
    "city": "Dallas",
    "state": "TX",
    "zip": "75201",
    "price": "162500"
}, {
    "h_id": "4",
    "city": "Bevery Hills",
    "state": "CA",
    "zip": "90210",
    "price": "319250"
}, {
    "h_id": "5",
    "city": "New York",
    "state": "NY",
    "zip": "00010",
    "price": "962500"
}];

并希望根据以下顺序对其进行排序

cities = ['New York', 'Dallas', 'Bevery Hills']

实现目标的最佳途径是什么?

3 个答案:

答案 0 :(得分:5)

请注意,sort方法会进行排序,因此homes会发生变化。

homes.sort(function (a,b){
  return cities.indexOf(a.city) - cities.indexOf(b.city)
});

答案 1 :(得分:4)

由于您可以使用indexOf cities来查找任何家庭对象的最终索引,因此您可以比Array.prototype.sort更有效地执行此操作:

var sortedHomes = new Array(cities.length);

homes.forEach(function (home) {
    var sortedIndex = cities.indexOf(home.city);
    sortedHomes[sortedIndex] = home;
});

(这仍然是O(n²)。你可以通过将cities翻转到一个hashmap中来使其成为O(n),但前提是你已经测量了这个优化是值得的。)< / SUP>

如果多个家庭可以共享同一个城市且cities不包含重复的条目(如果是这种情况,似乎最有可能出现这种情况),您可以按城市对家庭进行分组并合并由cities

var homesByCity = {};

homes.forEach(function (home) {
    var cityHomes = homesByCity[home.city];

    if (cityHomes) {
        cityHomes.push(home);
    } else {
        cityHomes = homesByCity[home.city] = [home];
    }
});

var sortedHomes = cities.reduce(function (sortedHomes, city) {
    return sortedHomes.concat(homesByCity[city] || []);
}, []);

(即使实施不一定,方法也是O(n)。)

答案 2 :(得分:1)

我建议使用一些函数式编程来解决这个问题。下面的代码段可以为您提供所需的结果。

var sorted = cities.map(function(city) {
    return homes.filter(function(home) {
        return home.city === city;
    });
});

首先,映射cities数组以基于它创建新数组。其次,对于每个城市,在homes数组中找到相应的项目,并将其添加到sorted数组中的正确位置。