首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >处理此数组的更好的数据结构

处理此数组的更好的数据结构
EN

Stack Overflow用户
提问于 2012-08-16 09:01:26
回答 3查看 60关注 0票数 1

我有一个从服务器获取的数据数组(按日期排序):

[ {date:"2012-8", name:"Tokyo"}, {date:"2012-3", name:"Beijing"}, {date:"2011-10", name:"New York"} ]

我想:

  1. 获取日期为给定年份的第一个元素的名称,例如,给定2012,我需要Tokyo
  2. 获取给定name的年份
  3. 更改name的日期

我应该使用哪种数据结构来提高效率?

因为数组可能很大,所以我不喜欢循环数组来查找

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-08-16 09:06:20

由于数据可能已经按降序日期排序,所以可以对该数据进行二进制搜索,以避免执行完全线性扫描。

要处理未声明的要求,即更改日期将更改排序,您需要执行两个搜索,如上面所述,这可能是二进制搜索。在找到当前索引和它应该在的索引之后,您可以使用两个对Array.splice()的调用将元素从数组中的一个位置移动到另一个位置。

若要按名称处理搜索,并假设每个name都是唯一的,则应创建从名称映射到元素的二级结构:

代码语言:javascript
复制
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元素的引用,所以在这两个元素中都会发生对这些元素的更改。

票数 1
EN

Stack Overflow用户

发布于 2012-08-16 09:04:24

假设您使用的是独特的城市,我将使用城市名称作为地图键:

代码语言:javascript
复制
cities = {
  Tokyo: {
    date: "2012-8" 
  },
  New York: {
    date: "2011-10"
  }
}

按日期搜索:

代码语言:javascript
复制
function byDate(date) {
  for(el in cities) {
    if(cities.hasOwnProperty(el) && cities[el].date === date)
      return el;
  }
}
票数 1
EN

Stack Overflow用户

发布于 2012-08-16 09:55:40

为了记录在案:在不重新设计日期结构的情况下,您可以使用排序与数组filtermap方法相结合:

代码语言:javascript
复制
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);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11983809

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档