更好的数据结构来处理这个数组
Better data structure to handle this array
我有一个从服务器获取的数据数组(按日期排序):
[ {date:"2012-8", name:"Tokyo"}, {date:"2012-3", name:"Beijing"}, {date:"2011-10", name:"New York"} ]
我想 :
- 获取日期在给定年份的第一个元素的名称,例如,给定
2012
,我需要Tokyo
- 获取给定
name
的年份 - 更改
name
的日期
我应该使用哪种数据结构来使其有效?
因为数组可能很大,我宁愿不循环数组来查找某些内容
由于数据似乎已经按降序日期排序,因此您可以对该数据使用二进制搜索以避免执行完整的线性扫描。
为了处理更改日期将更改顺序的未声明要求,您需要执行两次搜索,如上所述,这可能是二进制搜索。 找到当前索引以及它应该所在的索引后,您可以使用两次调用 Array.splice()
将元素从数组中的一个位置移动到另一个位置。
要按名称处理搜索,并假设每个name
都是唯一的,您应该创建一个从名称映射到元素的辅助结构:
var map = {};
for (var i = 0, n = array.length; i < n; ++i) {
var name = array[i].name;
map[name] = array[i];
}
然后,您可以使用map
阵列直接解决需求 2 和 3。
由于map
元素实际上只是对array
元素的引用,因此对这些元素的更改将在两者中发生。
假设您使用的是唯一的城市,我会使用城市名称作为地图键:
cities = {
Tokyo: {
date: "2012-8"
},
New York: {
date: "2011-10"
}
}
要按日期搜索:
function byDate(date) {
for(el in cities) {
if(cities.hasOwnProperty(el) && cities[el].date === date)
return el;
}
}
仅供记录:无需重新设计日期结构,您就可以将排序与数组filter
或map
方法结合使用:
function sortByDate(a,b){
return Number(a.date.replace(/[^'d]+/g,'')) >
Number(b.date.replace(/[^'d]+/g,''));
}
var example = [ {date:"2012-8", name:"Tokyo"},
{date:"2012-3", name:"Beijing"},
{date:"2011-10", name:"New York"} ]
.sort(sortByDate);
//first city with year 2012 (and the lowest month of that year)
var b = example.filter(function(a){return +(a.date.substr(0,4)) === 2012})[0];
b.name; //=> Beijing
//year of a given city
var city = 'Tokyo';
var c = example.filter(function(a){return a.city === city;})[0];
c.year; //=> 2012
//change year of 'New York', and resort data
var city = 'New York', date = '2010-10';
example = example.map(
function(a){if (a.name === city) {a.date = date;} return a;}
).sort(sortByDate);
相关文章:
- javascript处理一个对象数组以获得一个新的对象数组
- call()和apply()实际上是用来欺骗方法处理类似数组的对象的
- 在JavaScript中处理数组和对象时需要帮助
- 处理docXTemplater或javascript对象数组中未定义的值
- Emberjs#每个循环不处理数组数据
- 如何在angular js/HTML中处理数组
- 处理对象数组并将它们以 4 个为一组进行分配
- AngularJS错误处理:根据错误数组显示错误
- JavaScript-在数组中查找元素,并从用户提示中处理null
- 按子数组处理数组
- 使用数组处理 JavaScript 字符串 为什么它在控制台上打印“R”而不是“Z”
- 二维数组处理
- 用javascript(服务器端)将大型CSV文件转换为JSON数组:处理内存不足问题
- Javascript:将数组处理成对象(按角度)
- Javascript (JQuery)将数组处理为汇总数据的最优算法
- 如何将数组处理为获取STR到url
- Node.js for循环并行数组处理,只有一个回调
- 从PHP到Javascript的数组处理
- JavaScript数组处理-ActiveX与FF插件
- 为什么属性初始化为null的对象数组处理得更好