Javascript-按键搜索对象

Javascript-按键搜索对象,javascript,json,search,loops,optimization,Javascript,Json,Search,Loops,Optimization,我知道在这方面有很多答案,大多数人建议通过对象循环,返回你需要的,我不确定这是最好的方法,无论如何,在我的情况下 我拥有的是一个数组,其中包含条目引用另一个数组人物(包含id和姓名),由人物id和项目id创建 我需要的是能够在条目的循环中访问具有特定id的项目和人员,以便获取他们的姓名。按照别人的建议,我会在条目中的人和项目之间循环,这似乎是非常多的循环 所以我想我应该从init上的people和projects创建一个我称之为“hashtable”的东西,这意味着创建一个新的对象people\

我知道在这方面有很多答案,大多数人建议通过对象循环,返回你需要的,我不确定这是最好的方法,无论如何,在我的情况下

我拥有的是一个数组,其中包含
条目
引用另一个数组
人物
(包含
id
姓名
),由
人物id
项目id
创建

我需要的是能够在
条目
的循环中访问具有特定
id
的项目和人员,以便获取他们的姓名。按照别人的建议,我会在
条目
中的
项目
之间循环,这似乎是非常多的循环

所以我想我应该从init上的
people
projects
创建一个我称之为“hashtable”的东西,这意味着创建一个新的对象
people\u hashtable
projects\u hashtable
,其中key是id

所以

会变成

{
    "8": {
        "name": "John Doe"
    }
}
通过这种方式,我可以轻松访问名称,而无需一直循环,同时仍保持原有数组的原始顺序(这就是为什么我不直接从服务器输出它的原因,您无法对对象进行完全排序,我在选择框中同时使用
人员
项目
,需要按名称排序)

我做得对吗?有更好的办法吗?或者我应该完全忘记这一点,按照另一个问题中的建议继续搜索循环吗


我试图在服务器端和客户端都尽可能高效。

以下代码可能会对您有所帮助

var-arr=[
{
“id”:“8”,
“姓名”:“约翰·多伊”
}
];
var obj={};
对于(变量i=0;i
为了避免循环,您基本上将所有对象加倍。所以,除非你有一些糟糕的性能问题,否则我会避免。 如果您真的需要一种hashmap,我更愿意存储数组的索引,而不是对象的另一个副本:

// array
var arr = [
  {
    "id": "8",
     "name": "John Doe"
  }
];

// lookup table
var lookup = {
  "8": 0
}
当然,这样做意味着您不能在不重新构建hashmap的情况下修改数组的属性

生成它非常简单:

var lookup = arr.reduce(function(lookup, item, index) {
  lookup[item.id] = index;
  return lookup;
}, {});
您还可以使用它生成您在问题中提到的对象:

var lookup = arr.reduce(function(lookup, item) {
  lookup[item.id] = {name: item.name};
  return lookup;
}, {});
但正如我所说,这是我将避免的事情。

这个库使它非常容易实现。规范化和非规范化

它可以扭转这种局面

{
  "id": "123",
  "author": {
    "id": "1",
    "name": "Paul"
  },
  "title": "My awesome blog post",
  "comments": [
    {
      "id": "324",
      "commenter": {
        "id": "2",
        "name": "Nicole"
      }
    }
  ]
}
进入这个

{
  result: "123",
  entities: {
    "articles": { 
      "123": { 
        id: "123",
        author: "1",
        title: "My awesome blog post",
        comments: [ "324" ]
      }
    },
    "users": {
      "1": { "id": "1", "name": "Paul" },
      "2": { "id": "2", "name": "Nicole" }
    },
    "comments": {
      "324": { id: "324", "commenter": "2" }
    }
  }
}

反过来说。

我知道怎么做,我只是想问这是否是个好主意。这个问题很可能被淹没在书堆里了。对不起。当然,这是个好主意,因为它使搜索变得又快又容易。这很有趣!是的,我想这比复制整个对象要好。虽然reduce似乎是ecma5的东西,所以我可能不得不坚持使用旧版本来构建查找表。5在所有主流和现代浏览器中都受支持;加上ES6即将推出。如果您必须支持像IE8这样的旧浏览器,那么我建议您始终使用。特别是对于
reduce
,虽然此链接可以回答问题,但最好在此处包含答案的基本部分,并提供链接供参考。如果链接页面发生更改,仅链接的答案可能无效。-无论如何,在这种情况下,这没有多大意义。考虑到答案指向一个库,我需要让我答案中的代码片段始终与所述库的API保持最新(该库最近确实发生了完全的变化),而显然它在项目的github上始终是最新的。我确实添加了一个库处理数据的示例,这正是我在问题中所要求的,所以它也没有多大意义,但不管怎样。
var articles= {
    "item1":{
         "id":"155",
         "name":"First Item",
         "value":-5199.6
    },
    "item2":{
         "id":"255",
         "name":"Second Item",
         "value":-424.91
    }
}

var ids = [];
for(var item in articles) {
    ids.push(articles[item]['id']);
}

console.log(ids);
{
  result: "123",
  entities: {
    "articles": { 
      "123": { 
        id: "123",
        author: "1",
        title: "My awesome blog post",
        comments: [ "324" ]
      }
    },
    "users": {
      "1": { "id": "1", "name": "Paul" },
      "2": { "id": "2", "name": "Nicole" }
    },
    "comments": {
      "324": { id: "324", "commenter": "2" }
    }
  }
}
var articles= {
    "item1":{
         "id":"155",
         "name":"First Item",
         "value":-5199.6
    },
    "item2":{
         "id":"255",
         "name":"Second Item",
         "value":-424.91
    }
}

var ids = [];
for(var item in articles) {
    ids.push(articles[item]['id']);
}

console.log(ids);