var data = localStorage.getItem('oldData').split(" ");
我正在访问如上所述的localStorage并获取一组值。某些元素在oldData
的字符串值中重复,例如:
apples oranges apples apples
我希望数据只有两个元素apples
和oranges
。我怎么能用Javascript做到这一点?
答案 0 :(得分:2)
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);
});
}
除了散列之外,它击败所有其他答案的原因是因为它能够在不进行排序步骤的情况下获得排序的好处。它只能从当前项目向前搜索,而从另一端向后搜索,因此永远不会出现两个项目相互检查两次的情况,并且永远不会进行不必要的比较,因为它总是会退出做出最终决定所需的最少工作量。并且它通过尽可能少地创建占位符变量作为奖励来完成所有这些。
答案 1 :(得分:0)
首先使用push
在数组中插入一个值var array = [];
array.push("newvalue");
然后下一次插入值,使用“for循环”检查数组中是否存在值。然后,如果该值不存在,请再次使用push()插入该值
答案 2 :(得分:0)
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;
};
答案 3 :(得分:0)
这样的事情可以解决问题:
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;
}
答案 4 :(得分:0)
这是我最后使用的
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++;
}
}