通过对象迭代,属性变得异常奇怪

时间:2016-06-23 09:12:02

标签: javascript arrays

我现在正把头撞在桌子上。 我无法理解为什么当我使用console.log()时,当我清楚地看到对象时,我无法遍历我的JSON对象。

这是我目前的循环:

for (var i = 0; i < list.length; i++) {
  for (var y = 0; y < list[i].information.locations.length; y++) {
    if (list[i].information.locations[y].city !== '') {
      newArr.push({
        "city": list[i].information.locations[y].city,
        "country": list[i].information.locations[y].country
      });
    }
  }
}

这给了我以下错误:TypeError: Cannot read property 'locations' of undefined

但是从我的终端屏幕截图中可以看出,我清楚地知道信息对象和包含对象的位置数组。

enter image description here

如果我在第一个console.log(list[i].information);循环中尝试执行:for,我只得到undefined

主要问题是我似乎有列表[i]。信息未定义或其他东西。但我认为它是定义的,因为当我使用对象执行整个数组的大型console.log时,我可以看到它。

任何人都知道为什么会这样吗? Tyvm。

2 个答案:

答案 0 :(得分:0)

根据我的理解,你的代码在这一行打破了:

// get the user's consent to determine the location
var status = await Geolocator.RequestAccessAsync();
if (status == GeolocationAccessStatus.Allowed)
{
    // get the current position
    Geolocator locator = new Geolocator() { DesiredAccuracy = PositionAccuracy.High };
    Geoposition pos = await locator.GetGeopositionAsync();
    BasicGeoposition current = new BasicGeoposition()
            { Latitude = pos.Coordinate.Latitude,
                Longitude = pos.Coordinate.Longitude };

    // set the lat/long of the restaurant
    BasicGeoposition restaurant = new BasicGeoposition()
            { Latitude = 51.91997, Longitude = 4.486515 };

    // get the driving route
    MapRouteFinderResult route = 
            await MapRouteFinder.GetDrivingRouteAsync(new Geopoint(current), 
                                                        new Geopoint(restaurant), 
                                                        MapRouteOptimization.Time, 
                                                        MapRouteRestrictions.None);
    // get the view and add it to the map
    MapRouteView routeView = new MapRouteView(route.Route);
    routeView.RouteColor = Windows.UI.Colors.Red;
    TheMap.Routes.Add(routeView);

    // change the view of the map to see the complete route
    await TheMap.TrySetViewBoundsAsync(route.Route.BoundingBox, 
                                        null, MapAnimationKind.Default);
}

如果列表中有一个不具有相同结构的对象,它将会中断。

Sample JSFiddle

你应该尝试这样的事情:

for (var y = 0; y < list[i].information.locations.length; y++)

Sample JSFiddle

答案 1 :(得分:0)

奇怪但有用的其他人知道。
我的.information对象未定义,因为我的mongoose模型在我写这个问题的时候没有包含它。

我认为这很奇怪,因为我可以在我的数组中清楚地看到它,但它没有在代码中定义。但它在终端。

我刚刚将"information": {}和其他内容添加到我的模型中,一切都变得轻而易举。