访问对象内多维数组内的对象元素

时间:2015-11-24 15:40:24

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

我正在使用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和过滤器,但还没能专门隔离lan和lng。

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

3 个答案:

答案 0 :(得分:2)

var dialog = new MessageDialog (this, DialogFlags.Modal, MessageType.Info, ButtonsType.YesNo, "The Hulk could totally take Super Man"); dialog.Response += (object o, ResponseArgs args) => { if (args.ResponseId == ResponseType.Yes) { Console.WriteLine("Yes clicked"); } else if (args.ResponseId == ResponseType.No) { Console.WriteLine("No clicked"); } else if (args.ResponseId == ResponseType.DeleteEvent) { Console.WriteLine("Dialog closed without clicking a button"); } dialog.Destroy(); }; dialog.Run(); 绑定的上下文中,您需要执行以下操作:

foreach:city

基本上,你<span data-bind="text: $data[1][0].lat"></span> <span data-bind="text: $data[1][0].lng"></span> 数组有一个名为states的属性(错误名称,它应该是city),它本身就是一个数组。所以你需要索引那个数组(这是cities正在做的事情),并且该数组中的每个项本身就是一个数组,其中第一项是城市的名称,第二项是一个带有单个对象的数组您需要的foreachlat属性。

lng之类的东西会给你viewModel.states[0].city[0][1][0].lat

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

答案 1 :(得分:0)

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

每个地方都包含一个包含单个元素的数组 - 纬度,经度对。 e.g。

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

因此
locationOfPlace = aState[aPlaceName][1]

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

答案 2 :(得分:0)

你做出了一个奇怪的决定,将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