【问题标题】:Accessing an element of an object inside a multidimensional array inside an object访问对象内多维数组内的对象元素
【发布时间】:2016-02-27 03:23:58
【问题描述】:

我正在使用 knockout.js,而我的 viewModel 是一个内部包含多维数组的对象,我无法访问特定元素。我的代码是:

var viewModel = {
    states: [
        new state("Virginia", [["Va Beach",[{lat:36.852926,lng:-75.977985}]], ["Chincoteague Island",[{lat:37.933179,lng:-75.378809}]]]),
        new state("Maryland", [["Atlantic City",[{lat:39.364283,lng:-74.422927}]], ["Ocean city",[{lat:38.336503,lng:-75.084906}]]]),
        new state("North Carolina", [["Oakacroke",[{lat:35.114615,lng:-75.98101}]], ["Nags Head",[{lat:35.957392,lng:-75.624062}]],["Emerald Isle",[{lat:34.677940,lng:-76.950776}]]])
        ]
};

var state = function(name, city) {
    this.name = name;
    this.city = ko.observableArray(city);
}

我正在尝试获取每个城市的纬度和经度。我玩过 JSON.stringify 和 filter,但无法专门隔离 lan 和 lng。

http://codepen.io/ntibbs/pen/vNMKzg?editors=101

【问题讨论】:

  • 在不知道state() 的情况下无法说出如何访问这些属性。
  • 您可以像这样访问每个州的城市的属性:viewModel.states[0].city[0][1][0].lat。请注意,要遍历它们,您需要两个循环,一个用于州,一个用于城市,然后使用 viewModel.states[nState].city[nCity][1][0].lat

标签: javascript jquery arrays multidimensional-array knockout.js


【解决方案1】:

foreach:city 绑定的上下文中,您需要执行以下操作:

<span data-bind="text: $data[1][0].lat"></span>
<span data-bind="text: $data[1][0].lng"></span>

基本上,您的states 数组有一个名为city 的属性(坏名,它真的应该是cities),它本身就是一个数组。因此,您需要索引该数组(这就是foreach 正在做的事情),并且该数组中的每个项目本身都是一个数组,其中第一项是城市名称,第二项是一个带有单个对象的数组 @您需要的 987654327@ 和 lng 属性。

所以像viewModel.states[0].city[0][1][0].lat 这样的东西应该会给你36.852926

当然,看看访问您需要的属性是多么复杂,可能值得考虑将其转换为更易于使用的东西。

【讨论】:

  • 我同意。我认为重新处理我的数据是避免更多此类问题的最佳途径。
  • 是的 - 数据嵌套似乎过多,因此很难在没有编码器错误的情况下处理。
【解决方案2】:

您做出了一个奇怪的决定,将 lat/lon 对象包装在一个数组中,就好像一个城市可能附加了多个坐标一样。

我认为,如果除了有一个 state 对象之外,你还有一个 city 对象,而不是一个对象字面量,这将有助于清理你的设计。比如:

var city = function(name, lat, lon) {
    this.name = name;
    this.location = {
        lat: lat,
        lon: lon
    };
};

然后你会声明一个更像:

new state("Virginia", [
  new city("Va Beach", 36.852926, -75.977985),
  new city("Chincoteague Island", 37.933179, -75.378809)
]);

您可能会像这样访问城市属性:

state.city()[0].location.lat

【讨论】:

    【解决方案3】:

    是的,每个 state 对象都有一个名称,并包含一个地点数组。

    每个地方都包含一个带有单个元素的数组 - 纬度、经度对。 例如

    ("Virginia",   
       [  
          [
              "Va Beach",
                  [
                      {lat:36.852926,lng:-75.977985}
                  ]  
          ]  
       ]
    )
    

    所以
    locationOfPlace = aState[aPlaceName][1]

    并引用每个属性:
    latitudeOfPlace = aState[aPlaceName][1].lat
    longitudeOfPlace = aState[aPlaceName][1].lng

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-02
      • 2019-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-22
      相关资源
      最近更新 更多