2013-04-10 74 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);