【发布时间】:2016-09-20 23:04:04
【问题描述】:
我有一个类似于以下的对象数组:
var routeArr = [
{start: 1, end: 2},
{start: 1, end: 3},
{start: 1, end: 4},
{start: 2, end: 1},
{start: 3, end: 1},
{start: 4, end: 1}
];
这些对象代表线的起点和终点,因此,{start: 1, end: 2} 和 {start: 2, end: 1} 代表同一条线。
我正在尝试从数组中删除所有重复的行,但找不到有效或优雅的方法来执行此操作。我尝试过嵌套循环,但有人告诉我这是不好的做法(而且我的实现出现错误,而且很丑陋)。
for(var i = 0, numRoutes = routeArr.length; i < numRoutes; i++) {
var primaryRoute = routeArr[i];
for(var j = 0; j < numRoutes; j++) {
var secondRoute = routeArr[j];
if(primaryRoute.start === secondRoute.end && primaryRoute.end === secondRoute.start) {
routeArr.splice(j, 1);
continue;
}
}
}
谁能给点建议?
【问题讨论】:
-
执行此操作的正常方法是:首先对其进行排序(在您的情况下,如果 (end > start),您应该反转开始和结束)。然后重复的行将彼此完全相同。然后只需循环删除重复的
-
当你删除数组的一个元素时,永远不要运行从 0 到长度的循环。这是不安全的,因为删除后您必须调整索引。更好地按降序运行循环,即从长度 1 到 0,这将在您删除数组元素并且永远不会返回具有更大索引的元素的情况下起作用。此外,您的 if 语句仅检查一个相同行的条件,您还必须使用 or 语句添加其他检查。
标签: javascript arrays javascript-objects