JavaScript数组键查找

6

如果这个问题之前已经被问过了,我很抱歉,因为这是一个很难搜索到的问题...

我想使用JavaScript数组来保存对象,其中键为ID

例如,假设我有一堆具有不同ID的人

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

 var people[4] = person;

我希望能够通过people[ID].property来引用该用户,但问题在于现在这个数组的输出结果是:

 null,null,null,null,object

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

我是不是很愚蠢呢? :-) 我们可以对字符串做到这一点,那么为什么不能对非连续数字做到呢?

我试图避免每次想要访问数组中特定人员时都必须循环遍历每个对象,因此我想使用ID号作为键会起作用。

谢谢大家! :-)


1
“数组输出”是什么意思?是的,在JS中,数组是稀疏的,你最好考虑在这种情况下使用对象,但我承认我仍然不明白你展示的例子有什么问题。 - raina77ow
1
这个数组现在的输出将会是 null,null,null,null,object。数组并没有真正的“输出”。你的数组将会在索引4处有一个元素,如果你尝试访问较低的索引,例如 people[2],你会得到 undefined 而不是 null。另外,在 var people[4] = person; 中你有一个语法错误,需要删除 var - nnnnnn
3个回答

9

使用字典对象

var people = {};
people[4] = 'me';

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+,但是对于旧版浏览器,有一些polyfills可供使用。

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

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

我们正在向该对象添加新属性,因为JavaScript中的每个对象都可以看作是哈希表。
如果您使用数组,它仍然是一个对象,您可以使用字符串作为键向其添加属性。但如果您像这样执行people[4] ='toto';,则将字符串添加到数组中,数组的长度将变为5。当然,数字4仍将是此数组对象的属性。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接