2015-09-15 6 views
0

Все:Что наиболее эффективно для простой итерации массива на элементе массива

Скажем, у меня есть массив объектов, каждый из которых имеет значение attr. То, что я хочу сделать, это:

Loop через массив и удалять объекты, стоимость которых меньше 1,

Я думал использовать сращивание или создать другой массив, нажмите те, чьи значение> = 1 в него затем верните новый массив, интересно, какой путь лучше? Или любой другой эффективный способ?

Благодаря

ответ

1

Внутренне сращивания делает новый массив, так что за кулисами вы будете создавать новый массив для каждого объекта, который необходимо удалить. Это означает, что для создания одного массива нажатие на него требует только того, чтобы объекты были намного эффективнее, чем сплайсинг.

+0

Спасибо за ответ. Я понял. – Kuan

2

Если вы хотите сохранить исходный массив нетронутым:

arr.filter(function(elem) { 
    return elem.value >= 1; 
}) 

Мое чтение вашего вопроса привело меня, чтобы понять, что каждый элемент массива имеет value свойство. Если вместо этого каждый элемент представляет собой только сравнимое фактическое значение, замените «elem.value» на «elem».

[UPDATE]

Основываясь на jsperf comparison, если все в порядке с модифицируя исходный массив, то splice подход, представленный в @ NicholasHazel Ответим на самом деле на порядок быстрее.

Я даже попробовал третий подход, используя slice(), чтобы сначала сделать копию исходного массива, а затем с помощью splice() на копии, но это было намного медленнее, чем другие.

+0

Спасибо. Да, вы понимаете правильно, поэтому вы все еще считаете, что функция фильтра работает быстрее, чем простой цикл и сращивание? – Kuan

+0

Вы должны попробовать синхронизировать оба подхода несколько раз с большими массивами. – cybersam

+0

Я создал сравнение [jsperf] (http://jsperf.com/so-array-filter), и подход сплайсинга, похоже, на порядок выше. Я обновил свой ответ с этой информацией. – cybersam

1

Для обеспечения эффективности сращивание будет вашим самым оптимальным решением для работы. До тех пор, пока вы не нуждаетесь в начальном массиве, я бы просто полностью преобразовал переменную.

var array = [-5,-4,-3,-2,-1,0,1,2,3,4,5]; 

for(var i=array.length-1; i>=0; i--){ 
    if(array[i] < 1) { 
     array.splice(i,1); 
    } 
} 

Если у вас есть необходимость использования исходного массива в более позднее время, нажав на новый массив является лучшим выбором:

var array = [-5,-4,-3,-2,-1,0,1,2,3,4,5]; 
var newArray = []; 

for(var i=array.length-1; i>=0; i--){ 
    if(array[i] < 1) { 
     newArray.push(array[i]); 
    } 
} 

Оба вполне разумными решения.

+0

Спасибо за ответ. Я понял. – Kuan

1
From the question if you are talking about array of object below is the solution which will keep intact the original array and its more efficient as well. 

Use delete operator which will put undefined on indexes which have value<=1 

What delete operator actually does, check with example at below link inside heading :Adding/Deleting array elements 

http://www.thesstech.com/javascript/arrays 

Ссылка для цикла Еогеасп можно найти по адресу: http://www.thesstech.com/javascript/array_foreach_method

<!doctype html> 
<html> 
    <head> 
    <script> 

     var obj1 = {value:0}; 
     var obj2 = {value:10};  

     var arr = [obj1,obj2]; 

      arr.forEach(function(x,counter,arr){ 
       if (arr[counter].value<=1) 
        delete arr[counter]; 
       } 
      ); 
     arr.forEach(function(x,counter,arr){ 
       document.write(arr[counter].value); 
       } 
     ); 


    </script> 
    </head> 
</html> 
+0

Спасибо, я понял. – Kuan

Смежные вопросы