6

很抱歉,如果以前有人问过这个问题,这很难搜索...

我想使用 javascript 数组来保存对象,键为 ID

例如,假设我有一群拥有不同 ID 的人

 var people = new Array();
 var person = {property: value}; // this is person ID 4

 var people[4] = person;

我希望能够通过说 people[ID].propery 来引用该用户

问题是这个数组的输出现在是;

 null,null,null,null,object

因为它期望键是 0,1,2,3,4

我是傻还是怎么的?:-) 我们可以正确处理字符串,那么为什么不使用非序列数字呢?

我要避免的是每次我想访问数组中的特定人时都必须遍历数组中的每个对象,因此我认为使用 ID 号作为密钥会起作用

多谢你们!:-)

4

3 回答 3

9

使用字典对象

var people = {};
people[4] = 'me';
于 2013-09-07T21:11:00.423 回答
3

我建议你使用集合。集合是对象的数组。然后,您可以传递每个人的属性。您可以按任何属性过滤您的收藏。如此接近您正在做的事情,但不是在索引上传递,而是id为每个人传递。

var people = [];  // a collection

var person = {
  id: 4,
  name: 'John'
};

people.push(person);

// Filtering:

// By id
var john = people.filter(function(person) {
  return person.id == 4;
});

// By name
var john = people.filter(function(person) {
  return person.name == 'John';
});

您可以抽象出上面的那些循环以重新使用它们。还要确保您的 id 是唯一的。如果数据来自数据库,它应该没问题,否则我会在某个地方跟踪它们。

与带有键的普通对象相比,集合的优点是可以排序和过滤,而不能保证属性顺序的对象,则不能那么简单。

请注意,filter仅适用于“现代浏览器”,因此 IE9+,但有适用于旧浏览器的polyfill

于 2013-09-07T21:20:27.727 回答
1

当我们使用字符串作为键时,像这样:

var people = {}; //this is an object
people[name] = 'toto';

我们正在为这个对象添加新属性,因为 javascript 中的每个对象都可以看作是一个哈希表。

如果您使用数组,它仍然是一个对象,您可以使用字符串作为键向它添加属性。但是如果你做类似的事情people[4] = 'toto';,你正在向数组中添加一个字符串,那么数组的长度将变为 5。当然,数字 4 仍然是这个数组对象的一个​​属性。

于 2013-09-07T21:19:28.430 回答