我的问题:
我有一个对象数组
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'}
]
我需要能够通过name属性识别数组中的对象。 [值得注意的是,数组中每个对象的name属性将是唯一的]。但是,它们不按任何特定模式排序。所以人们[0]可能会或者可能不会将该对象与“丹”的“名称”相等。
我希望能够通过组织数据来访问数据
people.Dan
返回对象
{age: '20', favoriteColor: 'blue'}
我觉得这应该相对简单,但我真的不知道用来描述问题的词语能够找到合适的解决方案。
编辑:对于将来读这篇文章的人,我决定采用Elliot的解决方案,而不是使用underscore.js。他们都解决了这个问题,但最终只是为了实现另一个功能而变得容易。答案 0 :(得分: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 :(得分:1)
您应该使用underscore.js或lodash。他们有一个名为findWhere的方法,它可以完全满足您的需求。如果有多个匹配对象,方法_.where将返回一个数组。
_.findWhere(people, {name: "dan"});
// will return
// {name: 'Dan', age: '20', favoriteColor: 'blue'}
答案 2 :(得分:-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());