0

Я использую 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); 
} 

Я пытаюсь получить лат и lng каждого отдельного города. Я играл с JSON.stringify и фильтром, но havent был в состоянии изолировать lan и lng специально.

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

+1

, не зная 'состояния() ' невозможно сказать, как получить доступ к свойствам. –

+0

Вы можете получить доступ к свойствам городов каждого состояния следующим образом: 'viewModel.states [0] .city [0] [1] [0] .lat'.Обратите внимание, что для их петли вам понадобятся два цикла: один для состояния, один для города, а затем использовать 'viewModel.states [nState] .city [nCity] [1] [0] .lat' –

ответ

2

В контексте foreach:city связывания, вы должны были бы сделать что-то вроде этого:

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

В принципе, вы states массив имеет свойство city (плохое название, это действительно должно должен быть cities), который сам является массивом. Поэтому вам нужно индексировать этот массив (что и делает), и каждый элемент в этом массиве сам является массивом, где первым элементом является имя города, а второй - массив с одним объектом с lat и lng которые вам нужны.

Так что-то вроде viewModel.states[0].city[0][1][0].lat бы должно дать вам 36.852926

Конечно, глядя на то, как запутанный это получить доступ к свойствам, нужно, это, вероятно, стоит подумать о преобразовании его в чем-то легче работать.

+0

Согласен. Я думаю, что переработка моих данных - лучший путь вперед, чтобы избежать таких проблем. –

+0

Yep - вложение данных кажется чрезмерным, и поэтому с ним невозможно справиться без ошибок кодирования. –

0

Да, каждый состояние объект имеет имя и содержит массив мест.

Каждое место содержит массив с одним элементом - широтой, долготой. , например.

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

Так
locationOfPlace = aState[aPlaceName][1]

И ссылаться на каждое свойство:
latitudeOfPlace = aState[aPlaceName][1].lat
longitudeOfPlace = aState[aPlaceName][1].lng

0

Вы сделали странное решение обернуть широты/долготы объекта в массиве, как будто город может иметь несколько координат, прикрепленных к нему.

Я думаю, что это поможет прояснить ваш дизайн, если помимо объекта 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 
Смежные вопросы