Javascript: Как очистить неопределенные значения из массива - PullRequest
4 голосов
/ 07 марта 2012

Я пытаюсь перебрать массив, удалить и пропустить элементы, пока не существует только один. я пробовал соединять, но это портит мой цикл, потому что элемент из arr [1] становится arr [0] и т. д.

Допустим, есть 10 человек. Я хотел бы удалить человека 1, затем оставить человека 2, затем удалить человека 3 и оставить человека 4. Этот шаблон будет продолжаться, пока не останется только один.

подойдет любая помощь.

Ответы [ 13 ]

27 голосов
/ 15 декабря 2014

Фильтр фальшивых предметов:

var a=[1,2,"b",0,{},"",NaN,3,undefined,null,5];
var b=a.filter(Boolean); // [1,2,"b",{},3,5]
9 голосов
/ 07 марта 2012

вы не должны изменять коллекцию во время итерации, не только JavaScript, но и весь язык, определять новый массив и добавлять в него те, которые вы хотите удалить, и повторять этот позже, чтобы удалить из первого.

7 голосов
/ 07 марта 2012

Когда вы соединяете, просто уменьшайте индекс вашего цикла.

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

Индекс снижения при сварке http://jsfiddle.net/mendesjuan/aFvVh/

var undef;
var arr = [1,2, undef, 3, 4, undef];
for (var i=0; i < arr.length; i++) {
    if ( arr[i] === undef ) {
        arr.splice(i,1);
        i--;
    }
}

Петля назад http://jsfiddle.net/mendesjuan/aFvVh/1/

var undef;
var arr = [1,2, undef, 3, 4, undef];
for (var i=arr.length - 1; i >=0; i--) {
    if ( arr[i] === undef ) {
        arr.splice(i,1);
    }
}

Копировать в новый массив http://jsfiddle.net/mendesjuan/aFvVh/2/

var undef;
var arr = [1,2, undef, 3, 4, undef];
var temp = [];
for (var i=0; i < arr.length; i++) {
    if ( arr[i] !== undef ) {
        temp.push(arr[i])
    }
}
arr = temp;

Используйте фильтр , который представляет собой простой способ создать новый массив

var undef;
var arr = [1,2, undef, 3, 4, undef];
arr = arr.filter(function(item){
    return item !== undef;
});

В конце всех этих примеров arr будет [1,2,3,4]

Производительность

IE 11, FF и Chrome согласны с тем, что Array.splice самый быстрый. В 10 раз (Chrome), в 20 раз (IE 11) быстрее Array.filter. Помещение элементов в новый массив также было медленным по сравнению с Array.slice. Увидеть http://jsperf.com/clean-undefined-values-from-array2

Я очень удивлен, увидев, что IE возглавил этот процесс, и увидел Chrome за FF и IE. Я не думаю, что когда-либо проводил тест с таким результатом.

3 голосов
/ 12 декабря 2012

Если вы случайно используете CoffeeScript , то для удаления неопределенного из массива сделайте это

values = ['one', undefined]
values = (item for item in values when item != undefined) 

values
/* => ['one'] */
3 голосов
/ 07 марта 2012

Петля в обратном направлении .(Таким образом, удаление элементов не повлияет на индексы элементов, еще не обработанных.)

1 голос
/ 12 июня 2012

Удивительно, но никто не ответил лучшим и правильным способом:

  1. Создать новый массив
  2. Итерировать в старом массиве и выдвигать только те элементы, которые вы хотите сохранить, в новый массив

некоторые кредиты переходят на @ nnnnnn комментарий

0 голосов
/ 17 марта 2018
>If you are getting undefined during deletion of the key-pair, Then to prevent "undefined" you can try code given below to delete key-pair  


   1) test = ["1","2","3","4",""," "];
   2) var delete = JSON.stringify(test);   
      case1) delete = delete.replace(/\,""/g,'');  
         or  
      case2) delete = delete.replace(/\," "/g,'');  
         or  
      case3) delete = delete.replace(/\,null/g,'');  

   3) var result = JSON.parse(delete);  
0 голосов
/ 07 марта 2012

Возможно, это не то, что вам нужно, но вы можете легко вычислить, каким будет последний элемент в конце этой процедуры, а затем просто взять его. Предполагая, что элементы массива являются смежными и начинаются с arr [0], вы можете найти:

var logBase2OfLength = Math.floor(Math.log(arr.length) / Math.log(2));
var finalElement = arr[(1 << logBase2OfLength) - 1];

По сути, если вы берете целую степень 2, которая меньше или равна количеству элементов в вашем массиве, это позиция элемента, которая останется после всех циклов и удалений.

0 голосов
/ 07 марта 2012

это образец для вас

<script lanauge = "javascript">
    var arr = ["1","2","3","4"];
    delete arr[1];// arr[1] is undefined
    delete arr[2];// arr[2] is undefined

    // now arr.length is 4

    var todelete = [];
    for (i = 0 ; i < arr.length ;i++)
    {
        if (typeof arr[i] == 'undefined') todelete.push(i);
    }

    todelete.sort(function(a, b) { return b-a }); // make the indeies from big to small

    for (i = 0;i < todelete.length; i ++)
    {
        arr.splice(todelete[i],1);
    }

    // now arr.length is 2

</script>
0 голосов
/ 07 марта 2012
function removeUndefined(array)
{
    var i = 0;
    while (i < array.length)
        if (typeof array[i] === 'undefined')
            array.splice(i, i);
        else
            i++;
    return array;
}

РЕДАКТИРОВАТЬ: Я написал это на основе названия. Похоже, вопрос задает что-то совершенно другое.

...