我有一个数组:
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']
实现目标的最佳途径是什么?
答案 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
数组中的正确位置。