【问题标题】:access javascript array element by JSON object key通过 JSON 对象键访问 javascript 数组元素
【发布时间】:2013-09-02 03:40:33
【问题描述】:

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

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

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

Zips[rows[i].Zipcode].Count

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

谢谢

【问题讨论】:

  • 这有什么问题?你能展示你的循环和rows对象吗?
  • Zips[1].Zip 将是 91710。由于您的邮政编码是 VALUES,而不是键,因此您不能将它们用作直接数组查找。您必须扫描该数组中的每个对象并匹配 zip 值。
  • 我不知道邮政编码,但“0265”是有效的邮政编码吗?如果在将它们用作Numbers 时要小心,您将失去领先的0s。
  • {} 中的每个对象都是 Zips 的对象,所以是的 - 您不需要循环,但您必须知道 @MarcB 指出的位置。

标签: javascript arrays json


【解决方案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 example

【讨论】:

    【解决方案2】:

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

    不,您必须循环并找到符合您条件的适当值。或者,您可以使用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"];
    

    【讨论】:

    • 我认为是这种情况,并且正在编写循环,但希望有一个更简单的解决方案。哦,好的,谢谢您的确认。
    • 您也可以使用filter 方法,如我的回答中所示,这将避免您编写循环的需要。这是一种本机方法,可能会更优化,但不要期望 O(1) 复杂度。
    【解决方案3】:

    你的代码中有几个错误。

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

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

    【讨论】:

      【解决方案4】:
      function getZip(zips, zipNumber) {
        var answer = null;
      
        zips.forEach(function(zip){
          if (zip.Zip === zipNumber) answer = zip;
        });
      
        return answer;
      }
      

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

      【讨论】:

        【解决方案5】:

        你试过了吗?

        Zips[i].Zip.Count
        

        【讨论】:

        • Count 不是 Zip 的属性。
        【解决方案6】:

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

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

        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;
        }
        

        【讨论】:

          猜你喜欢
          • 2016-05-18
          • 2019-09-17
          • 2019-09-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-06-09
          相关资源
          最近更新 更多