2013-04-10 65 views
1

我知道这里有很多答案,大多数人都建议通过对象循环,返回你需要的东西,但我不确定这是否是最好的方法,无论如何。Javascript - 通过键搜索对象

什么我是阵列entries引用到另一阵列people(与idname)由person_idprojects和(与idname)由project_id

我需要的是能够在entries的循环内访问项目和特定id的人,因此我可以获得他们的名字。做别人的建议我会循环peopleprojects在每个entries的激怒中,这看起来好像很糟糕的循环。

所以我想我会做的东西我称之为“哈希表”来自peopleprojects上的init,这意味着相当多创建一个新的对象people_hashtableprojects_hashtable,其中关键将是ID

所以

[ 
    { 
    "id": "8", 
    "name": "John Doe" 
    } 
] 

将成为

{ 
    "8": { 
     "name": "John Doe" 
    } 
} 

这样我会很容易接触到的南e没有循环所有的时间,同时仍然保持旧的阵列与它的原始顺序(这就是为什么我不是直接从服务器输出它,你不能完全订购一个对象,我同时使用peopleprojects在一个选择框,需要按名称排序)。

我在做对吧?有更好的方法吗?还是应该完全忘记这一点,并坚持按照其他问题中建议的搜索循环?

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

回答

3

您基本上将所有对象加倍以避免循环。所以,除非你有一些糟糕的性能问题,否则我会避免这种情况。 如果你真的,真的需要一种HashMap的,我宁愿存储阵列的指数,而不是对象的另一个副本:

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

// lookup table 
var lookup = { 
    "8": 0 
} 

当然这样做,意味着你不能修改阵列的不重建哈希映射。

生成它很简单:

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; 
}, {}); 

但正如我说这件事情我会避免。

+0

这很有趣!是的,我想这比复制整个对象要好。 – foxx 2013-04-10 09:49:37

+0

虽然减少似乎是ecma5的东西,所以我可能必须坚持一个很好的老来构建查找表 – foxx 2013-04-10 09:54:06

+1

ES5在所有主流和现代浏览器中都受支持;加上ES6正在开发中。如果您必须支持IE8等旧版浏览器,那么我建议始终使用[ES5 shim](https://github.com/kriskowal/es5-shim)。在[MDN](https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/Reduce)上只能找到'reduce' – ZER0 2013-04-10 10:02:13

0

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

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

var obj = {}; 
for(var i=0; i< arr.length; i++){ 
    obj[arr[i].id] = {name: arr[i].name}; 
} 

console.log(obj); 
+0

我知道如何做到这一点,我只是在问是不是一个好主意。这个问题可能在文本的墙上丢失了。抱歉。 – foxx 2013-04-10 09:47:19

+0

当然,这是一个好主意,因为它可以快速简单地进行搜索。 – Anoop 2013-04-10 11:17:19

-1

这个lib https://github.com/paularmstrong/normalizr使它很容易做到。规范化和非规范化。

它可以把这个

{ 
    "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" } 
    } 
    } 
} 

和周围的其他方式。

+0

虽然这个链接可能回答这个问题,最好在这里包含答案的基本部分,并提供参考链接。如果链接页面更改,则仅链接答案可能会失效。 - [来自评论](/ review/low-quality-posts/16462894) – 2017-06-19 12:09:19

+0

无论如何,这并没有多大意义。考虑到答案是指向一个图书馆,我需要保持我的答案中的代码片段始终与所述图书馆的API(最近完全改变)的API保持同步,而显然它始终是最新的项目的github。我确实增加了一个关于数据库的例子,这正是我在问题中所要求的,所以它也没有什么意义,但是无论如何。 – foxx 2017-06-19 13:13:38

0
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);