0

我有一个看起来像这样的数组

var Zips = [{Zip: 92880, Count:1}, {Zip:91710, Count:3}, {Zip:92672, Count:0}]

我希望能够通过 Zip 属性访问特定对象的 Count 属性,以便在获得另一个匹配的 zip 时增加计数。我希望这样的事情,但它不太正确(这将是一个循环)

Zips[rows[i].Zipcode].Count

我知道这是不对的,我希望有一个解决方案,而不是每次都循环遍历结果集?

谢谢

4

6 回答 6

5

我知道这是不对的,我希望有一个解决方案,而不是每次都循环遍历结果集?

不,您将不得不循环并找到符合您标准的适当值。或者,您可以使用以下filter方法:

var filteredZips = Zips.filter(function(element) {
    return element.Zip == 92880;
});
if (filteredZips.length > 0) {
    // we have found a corresponding element
    var count = filteredZips[0].count;
}

如果您以不同的方式设计对象:

var zips = {"92880": 1, "91710": 3, "92672": 0 };

那么您可以直接访问Count

var count = zips["92880"];
于 2013-08-29T15:47:51.947 回答
1

如果要保留数组 Zips 及其元素的格式

var Zips = [{Zip: 92880, Count:1}, {Zip:91710, Count:3}, {Zip:92672, Count:0}];
var MappedZips = {}; // first of all build hash by Zip
for (var i = 0; i < Zips.length; i++) {
    MappedZips[Zips[i].Zip] = Zips[i];
} 

MappedZips 是{"92880": {Zip: 92880, Count:1}, "91710": {Zip:91710, Count:3}, "92672": {Zip:92672, Count:0}}

// then you can get Count by O(1)
alert(MappedZips[92880].Count);

// or can change data by O(1)
MappedZips[92880].Count++;
alert(MappedZips[92880].Count);

jsFiddle 示例

于 2013-08-29T16:00:43.693 回答
1

在当前形式中,您无法通过其邮政编码访问一个元素而无需循环。

您可以将数组转换为这种形式的对象:

var Zips = { 92880: 1, 91710: 3 }; // etc.

然后你可以通过

Zips[rows[i].Zipcode]

要从数组转换为对象,您可以使用它

var ZipsObj = {};
for( var i=Zips.length; i--; ) {
  ZipsObj[ Zips[i].Zip ] = Zips[i].Count;
}
于 2013-08-29T15:50:05.530 回答
1

您的代码中有几个错误。

  1. 您的数组是对象的集合
  2. 您可以使用属性名称而不是属性值(即Zips[0]['Zip']正确)或对象表示法访问对象Zips[0].Zip

如果你想找到你必须循环的值

于 2013-08-29T15:51:43.883 回答
0
function getZip(zips, zipNumber) {
  var answer = null;

  zips.forEach(function(zip){
    if (zip.Zip === zipNumber) answer = zip;
  });

  return answer;
}

此函数返回 Zip 属性等于 zipNumber 的 zip 对象,如果不存在则返回 null。

于 2013-08-29T15:51:39.340 回答
-1

你试过这个吗?

Zips[i].Zip.Count
于 2013-08-29T15:50:25.703 回答