【发布时间】:2013-07-29 20:37:47
【问题描述】:
我有一个数组,其中一些元素是“重复”,我想删除数组中的重复。
所以比如左边的列表(数组)变成右边的数组:
Ingredients: Ingredients:
Apples Apples
Apples Oranges
Oranges Bananas
Oranges
Oranges
Bananas
什么是这样做的好算法?
现在这是我的 psuedocode 的样子:
for each element in ingredients (counter j)
for each element-below-current-element (counter k)
if ingredients[i] == element-below-current-element[j]
splice (delete) ingredients[i]
现在的问题是我注意到如果原始列表有 odd 个元素,那么我可能会得到这样的结果:
Ingredients: Ingredients:
Apples Apples
Oranges Oranges
Oranges Oranges
Oranges Bananas
Bananas
除了我可能会得到一种成分的双倍之外,一切都有效。
这是我的实际代码实现,在 javascript 中并带有一些角度元素(例如 $scope),尽管这并不重要。
for(var j = 0; j < $scope.groceryList.length; j++){
for(var k = j+1; k < $scope.groceryList.length; k++){ // for each of elements below current element (j)
if ( $scope.groceryList[j].name == $scope.groceryList[k].name){
$scope.groceryList.splice(k, 1);
}
}
}
现在让我感到惊讶的是,每当您删除一个数组元素时,数组长度是如何减少的,这会导致您的计数器在下一次迭代中向前跳跃一个元素等等......
【问题讨论】:
-
谢谢大家的回答!我会花一点时间来浏览它们。
标签: javascript arrays algorithm compare array-splice