在比较当前元素和下一个元素时如何遍历数组的最后一个元素?

时间:2018-08-08 04:31:40

标签: javascript arrays iteration arrow-functions

我有一个包含键值对的数组。键是(ID,Lat,Lon)。

我要做的是将当前元素ID与下一个元素ID进行比较,如果它们相等,则将当前元素的Lat和Lon放在对象中(在我的情况下为“ point”),然后调用一个函数(InjectIntoArray on该点将初始化全局数组points []。

当条件变为假(即当前ID不等于下一个ID)时,在其他部分中,我将当前元素Lat和Lon放在一个对象中并在该对象上调用函数,这是因为下一个元素的ID即将进行会有所不同,我必须获取当前元素ID的所有纬度和经度。

当检查最后一个元素时会发生问题,它会退出而不获取最后一条记录。(即list [lastElement])。

如何获取所有元素的纬度和经度?有没有更好的方法可以实现这一目标?

这是我的数组-

var list = [
            { id: 100, Lat: 19.25, Lon: 74}, { id: 100, Lat: 19.79, Lon: 74.19 }, 
            { id: 101, Lat: 19.99, Lon:75.10 }, { id: 101, Lat: 20.37, Lon:68.9}, 
            { id: 119, Lat: 17, Lon: 70 }, { id: 107, Lat: -16, Lon: -165 }, 
            { id: 107, Lat: -15, Lon: -150 }
           ];

和代码-

for (let i = 0; i < list.length - 1;i++) {
   if (list[i].id == list[i+1].id) {
      var point = { LATITUDE: list[i].Lat, LONGITUDE: list[i].Lon };
      InjectIntoArray(point);
   }
   else {
       var point = { LATITUDE: list[i].Lat, LONGITUDE: list[i].Lon };
       InjectIntoArray(point);
       plotRoute(false,2);
       points = [];
  }

}

3 个答案:

答案 0 :(得分:1)

不确定要做什么,但是如何做:

for (let i = 0; i < list.length; i++) {

     if (i == (list.length - 1)) {
        // do what you want to do with the last one
     }
     else if (list[i].id == list[i+1].id) {
        var point = { LATITUDE: list[i].Lat, LONGITUDE: list[i].Lon };
        InjectIntoArray(point);
     }
     else {
        var point = { LATITUDE: list[i].Lat, LONGITUDE: list[i].Lon };
        InjectIntoArray(point);
        plotRoute(false,2);
        points = [];
     }
}

答案 1 :(得分:1)

全局变量是非常糟糕的做法,并且在没有看到更多代码的情况下很难重构更多代码,但是一种选择是拥有一个持久变量,该变量指示正在迭代的当前idid更改后,请致电plotRoute并重新分配points。使用forEach并解构参数以减少语法噪音:

let currentId = null;
function setupNewId(id) {
  currentId = id;
  plotRoute(false,2);
  points = [];
}
list.forEach(({ id, Lat: LATITUDE, Lon: LONGITUDE }) => {
  if (id !== currentId) setupNewId(id);
  InjectIntoArray({ LATITUDE, LONGITUDE });
});

如您所见,这里我们要重新分配points并在新迭代的开始而不是最后一次调用plotRoute,所以没有关闭像您遇到的一个问题。

答案 2 :(得分:1)

我认为,最好的方法是使用reduce函数:

var list = [ // list from the example in original question
        { id: 100, Lat: 19.25, Lon: 74}, { id: 100, Lat: 19.79, Lon: 74.19 }, 
        { id: 101, Lat: 19.99, Lon:75.10 }, { id: 101, Lat: 20.37, Lon:68.9}, 
        { id: 119, Lat: 17, Lon: 70 }, { id: 107, Lat: -16, Lon: -165 }, 
        { id: 107, Lat: -15, Lon: -150 }
       ];
allRoutes = list.reduce(function(routes,e){
   if (!routes[e.id]) routes[e.id] = [];
   routes[e.id].push({LATITUDE: e.Lat, LONGITUDE: e.Lon});
   return routes;
}, {})

这样,您将获得一个对象,其中所有“路线”都分配给它们的ID。

{
  100: [{ "LATITUDE": 19.25, "LONGITUDE": 74    }, 
        { "LATITUDE": 19.79, "LONGITUDE": 74.19 }],
  101: [{ "LATITUDE": 19.99, "LONGITUDE": 75.1  }, 
        { "LATITUDE": 20.37, "LONGITUDE": 68.9  }],
  107: [{ "LATITUDE": -16,   "LONGITUDE": -165  }, 
        { "LATITUDE": -15,   "LONGITUDE": -150  }],
  119: [{ "LATITUDE": 17,    "LONGITUDE": 70    }]
}

现在,您可以遍历路线并逐个绘制路线,例如,通过以下方式:

plotRoute = function(r){ console.log('plotting route: ', r) }
Object.values(allRoutes).map(plotRoute)

干杯,iPirat