uniqueElementArray= Array.filter(function(itm,i,Array){
return i==Array.indexOf(itm);
});
Array包含1000个甚至超过1000个元素的集合。我们想从这个数组中获取独特的元素。我们正在使用上面提到的函数,最后我们得到了独特的Elements数组,但它正在创建性能问题。我怎样才能提高性能。在IE8和IE9.w
中花费了太多时间答案 0 :(得分:2)
答案 1 :(得分:1)
如果你可以对数组进行排序(元素的更改顺序),这个函数似乎很方便:
unique = function(in_array) {
var last, result=[];
in_array.sort();
for (var i in in_array) if (in_array[i] != last) result.push(last=in_array[i]);
return result;
}
编辑:
另见this answer,我认为这很棒!。
答案 2 :(得分:0)
以这种方式使用:
var array = Array.prototype.indexOf ?
function(arr, val) {
return arr.indexOf(val) > -1;
} :
function(arr, val) {
var i = arr.length;
while (i--) {
if (arr[i] === val) {
return true;
}
}
return false;
}
function removeRedundant(arr, equals) {
var val, origArr = arr.slice(0);
arr.length = 0;
for (var i = 0, len = origArr.length; i < len; ++i) {
val = origArr[i];
if (!array(arr, val)) {
arr.push(val);
}
}
return arr;
}
var arr = [1, 2, 2, 1, 3];
removeRedundant(arr);
console.log(arr); // [1, 2, 3]
答案 3 :(得分:0)
在IE8中,我比较一堆花车时遇到了非常慢的性能。在这种情况下,异步处理是唯一的选择,你不能得到“脚本需要太长时间”的消息。
IE8没有Array.filter函数,所以你的代码无论如何都无法在IE8中运行。
//create an array with 10.000 floats
var arr=[];
for(i=0;i<10000;i++){
arr.push(Math.random());
}
//adding one double float to make sure it will be removed
arr.push(arr[5]);
console.log("array created:",arr.length);
var now=new Date();
function getUniqueDone(arr){
console.log("done asynch",(new Date().getTime())-now);
console.log("length of array:"+arr.length);//usually is 10.000
}
// works only on arrays containing numbers or strings
function getUnique(arr,callback){
var i,j,len,counter,
chuncksOf=1000;//In IE8 I get script warnings at 150 already,
// FF and Chrome could handle 1000
// depending on what your array contains you can test a bit and
// set chuncksOf accordingly. current value does nnot work in IE8
// you have to set it to 100 and wait 20 seconds for output
if(arr.sort){
// on very large arrays this still might have a problem
console.log("sorting");
arr.sort();
console.log("sort done");
i=0;
}else{
i=arr.i;
arr=arr.arr;
}
len=arr.length;
counter=0;
while(i<len&&counter<chuncksOf){
for(j=i+1;j<arr.length;j++){
if(arr[i]===arr[j]){
arr.splice(j,1);
j--;
}
}
i++;
counter++;
}
if(i>=len){
callback(arr);
}else{
var pass={
arr:arr,
i:i
}
console.log("i is now:",i);
setTimeout(function(){
getUnique(pass,callback);
},0);
}
}
console.log("getting unique");
getUnique(arr,getUniqueDone);