【问题标题】:Removing duplicates from an array in Javascript [duplicate]在Javascript中从数组中删除重复项[重复]
【发布时间】:2011-12-02 18:53:37
【问题描述】:
var data = localStorage.getItem('oldData').split(" ");
我正在访问上面的 localStorage 并获取一组值。某些元素在oldData 的字符串值中重复,例如:
apples oranges apples apples
我希望数据只有两个元素 apples 和 oranges。我怎样才能在 Javascript 中做到这一点?
【问题讨论】:
标签:
javascript
local-storage
【解决方案1】:
Array.prototype.unique = function(){
return Object.keys(this.reduce(function(r,v){
return r[v]=1,r;
},{}));
}
系上它。这是 O(n),因为使用一个对象只需要您遍历数组一次并将其中的每个值分配为一个键,并在您进行时覆盖。这仅在值是基元(或者您有 Harmony WeakMaps)时才有效。但这几乎总是你想要做的那种数组,所以它可以解决。
对于奖励积分,这是第二个最好的方法。这至少是正常双循环答案的两倍,并且至少与需要预排序的答案一样好,
(但仍然比上述无限快的哈希方法差)。
Array.prototype.unique = function(){
return this.filter(function(s, i, a){
return i == a.lastIndexOf(s);
});
}
它击败除散列之外的所有其他答案的原因是因为它能够在不执行排序步骤的情况下获得排序的好处。它只从当前项目向前搜索,从另一端反向搜索,因此永远不会出现两个项目相互检查两次的情况,也永远不会进行不必要的比较,因为它总是在最做出最终决定所需的最少工作量。它以尽可能少地创建占位符变量作为奖励来完成所有这些工作。
【解决方案2】:
首先是使用 push 在数组中插入一个值
var array = [];
array.push("newvalue");
然后下一次插入值,使用“for循环”检查您的值是否存在于您的数组中。然后如果该值不存在,则再次使用 push() 插入该值
【解决方案3】:
Array.prototype.unique = function()
{
var a = [];
var l = this.length;
for(var i=0; i<l; i++)
{
for(var j=i+1; j<l; j++)
{ if (this[i] === this[j]) j = ++i; }
a.push(this[i]);
}
return a;
};
【解决方案4】:
这样的事情应该可以解决问题:
uniqueValues = function(array) {
var i, value,
l = array.length
set = {},
copy = [];
for (i=0; i<l; ++i) {
set[array[i]] = true;
}
for (value in set) {
if (set.hasOwnProperty(value)) {
copy.push(value);
}
}
return copy;
}
【解决方案5】:
这是我终于用的了
var data = localStorage.getItem('oldData').split(" ");
var sdata = data.sort();
var udata = [];
var j = 0;
udata.push(sdata[0]);
for (var i = 1; i < data.length - 1; i += 1) {
if (sdata[i] != udata[j]) {
udata.push(sdata[i]);
j++;
}
}