2014-01-30 111 views
0

我的問題:通過對象的屬性標識對象的數組

我有對象的數組,這樣

var people = [ 
     {name: 'Dan' , age: '20', favoriteColor : 'blue'}, 
     {name: 'Bob' , age: '35', favoriteColor : 'red' }, 
     {name: 'Frank', age: '22', favoriteColor : 'green'}, 
     {name: 'Ed' , age: '27', favoriteColor : 'yellow'} 
] 

我需要能夠通過他們的名字屬性標識數組中的對象。 [請注意,數組中每個對象的名稱屬性都是唯一的]。但是,它們不是以任何特定模式排序的。所以人們[0]可能會或可能不會等同於'丹'的'名字'的對象。

我希望能夠通過舉辦它來訪問數據,這樣

people.Dan 

返回對象

{age: '20', favoriteColor: 'blue'} 

我覺得這應該是比較簡單的,但我真的不知道這些話來描述問題,以便能夠找到適當的解決方案。

編輯:對於任何人在將來閱讀此文,我決定採用Elliot的解決方案而不是使用underscore.js。他們都解決了這個問題,但最終只是爲了實現另一個功能。

回答

1

您應該使用underscore.jslodash。他們有一個名爲findWhere的方法,它完全符合你的需求。如果有多個匹配對象,_.where將返回一個數組。

_.findWhere(people, {name: "dan"}); 
// will return 
// {name: 'Dan', age: '20', favoriteColor: 'blue'} 
+0

這是一般不好的形式建議包括使用一個函數的整個庫。此外,OP正在使用Node.js,讓Underscore與Node一起工作可能會很痛苦。 –

+0

@ElliotBonneville我不同意,首先,lodash在節點中非常容易使用,其次,這些小型實用程序庫非常有用。如果OP沒有可以做他要求的公用事業帶庫,他應該。 – dezman

+0

我從來沒有用過underscore.js,但是我聽到很多人在網上使用過它/寫過關於它的積極反饋。不知道我是否應該走這條路,只是爲了檢查它,儘管Elliot Bonneville提供的解決方案看起來也很穩固...... – Dan

3

現在people是一個數組。您需要將其重構爲一個對象,其中每個名稱都是返回該對象其餘部分的屬性。下面是其中一種做法:

var tempPeople = {}; 
for(var i = 0, len = people.length; i<len; i++) { 
    tempPeople[people[i].name] = people[i]; 
} 

people = tempPeople; 

你也可以離開people作爲數組,而使用Array.filter按名稱選擇:

var dan = people.filter(function(person) { return person.name == "Dan" })[0]; // returns the first person named Dan 
-1

製作對象構造函數。編寫一個自定義方法。

function person(name,age,favoriteColor) { 
    this.name = name; 
    this.age = age; 
    this.favoriteColor = favoriteColor; 
    this.getInfo = function() { 
     return this.age + " - " + this.favoriteColor; 
    } 
} 

var people = []; 

people.push(new person('dan','20','blue')); 

alert(people[0].getInfo()); 
+0

這不允許OP按名稱選擇用戶,但是,這正是他期待的。 -1 –

+0

是的,它是怪胎。只是警報(人[0] .name); – user2224693

+0

哎呀,對不起,剛剛得到它。 – user2224693

相關問題