Подтвердить что ты не робот

Удалите все значения фальши из массива

Я хотел бы удалить все значения фальши из массива. Значения фальши в JavaScript - false, null, 0, "", undefined и NaN.

function bouncer(arr) {
 arr = arr.filter(function (n) { 
    return (n !== undefined && n !== null && n !== false && n !== 0 && n !== "" && isNaN()!=NaN); });
  return arr;
}

bouncer([7, "ate", "", false, 9, NaN], "");

Вышеупомянутое удовлетворяет всем, кроме тестового примера NaN. Может кто-нибудь помочь мне проверить в массиве, содержит ли он NaN или нет?

4b9b3361

Ответ 1

Вы можете использовать Boolean:

var myFilterArray = myArray.filter(Boolean);

Ответ 2

Поскольку вы хотите избавиться от "ложных" значений, просто дайте JavaScript сделать следующее:

function bouncer(arr) {
  return arr.filter(function(v) { return !!v; });
}

Двойное применение оператора ! сделает обратный вызов фильтра true, когда значение "правдиво" и false, когда оно "ложно".

(ваш код вызывает isNaN(), но не передает ему значение, поэтому этот тест не сработал для вас. Функция isNaN() возвращает true, если ее параметр при принуждении к числу NaN и false в противном случае.)

edit — обратите внимание, что

function bouncer(arr) {
  return arr.filter(Boolean);
}

будет работать так же, как LoremIpsum отмечает в другом ответе, потому что встроенный булевский конструктор делает в значительной степени то же самое, что и !!.

Ответ 3

truthyArray = arr.filter(el => el)

^, что вы это делаете

Ответ 4

Вы используете isNaN() неправильно. Это должно быть что-то вроде следующего:

function bouncer(arr) {
   return arr.filter(function (n) { 
       return n !== undefined && n !== null && n !== false && n !== 0 && n !== "" && !isNaN(n); 
   });

}

Также вы можете переписать его:

function bouncer( arr ){
    return arr.filter( function( value ){
        return value;
    });
}

Ответ 5

Это еще одно эквивалентное, но иллюстративное решение:

function bouncer( arr ){
    return arr.filter( function( value ){
        return value ? true : false;
    });
}

Этот пример кода является иллюстративным, потому что он указывает читателю, что переменная value будет оцениваться как правдивая или ложная, а анонимная функция вернет логическое, либо true или false, отображение в оценку value.

Для тех, кто не знаком с этим методом удаления значений из массива на основе их правдоподобия или для тех, кто не знаком с (или не прочитал документацию) функцией filter, этот пример - это наиболее кратким, который все еще передает поведение функции filter.

Конечно, в вашем приложении вы можете выбрать более краткий, но менее проницательный вариант:

function bouncer( arr ){
    return arr.filter( function( value ){
        return value;
    });
}

Ответ 6

Я знаю, что это можно сделать с помощью метода arr.filter(). Но я предпочитаю использовать функцию Boolean(). Яснее для меня. Вот как я это сделал, хотя немного дольше:

function bouncer(arr) {
// Don't show a false ID to this bouncer.

    var falsy;
    var trueArr = [];

    for (i = 0; i < arr.length; i++) {

        falsy =  Boolean(arr[i]);

        if (falsy === true) {

        trueArr.push(arr[i]);

        }

    }

    return trueArr;
}

bouncer([7, "ate", "", false, 9]);
// returns a new array that is filtered accordingly.

Ответ 7

Используя фильтр мы можем написать

function bouncer(arr) {
 return arr.filter(item => item);
}
bouncer([false, null, 0, NaN, undefined, ""]) // will return [].

Ответ 8

Использование этого простого фильтра сделает:

array.filter(Boolean)

Вы можете узнать больше о Boolean здесь

Ответ 9

Я думаю, что лучше справиться с этим

   function bouncer(arr) {
        arr = arr.filter(function(item) {
            return item;
        return arr;

    bouncer([7, "ate", "", false, 9, NaN, undefined, 0]);

Ответ 10

Функция bouncer:

function bouncer(arr) {
  return arr.filter((val) => {
    return !!val;
  });
}

console.log(bouncer([7, "ate", "", false, 9]));

Ответ 11

Спасибо за все рабочие ответы выше. Вот 3 подхода к решению проблемы. Третье решение проблемы с помощью вашего подхода @Vignesh.

1. 
function bouncer(arr) {
  return arr.filter( function( val ){
        return val;
    });
}

2. 
function bouncer(arr) {
return arr.filter(Boolean);
}
3.
  function bouncer(arr) {
  return arr.filter(function(val){
      return val !== false && val !== "" && !(Number.isNaN(val)) && val !== 
undefined && val !== 0 && val !== null;
    });
 }

Ответ 12

Это моя идея...

function bouncer(arr) {
  // Don't show a false ID to this bouncer.
  var result = [];
  
    function isGood(obj){
      if(!Boolean(obj)){
        return false;
      } else {
        return true;
      }
    }
    
    for (var i=0; i < arr.length; i++){
      if (isGood(arr[i]) === true){
        result.push(arr[i]);
      }
    }
  return result;
}

console.log(bouncer([7, "ate", "", false, 9]));

Ответ 13

function bouncer(arr) {  
  var result = []; 
   for (var i = 0; i < arr.length; i++) {
     if (arr[i]) {
      result.push(arr[i]);
     }
   }
  return result;
 }

 bouncer([7, "ate", "", false, 9]);

Ответ 14

function falsy(value) {
      if (value) {
        return value;
      }
    }

    function bouncer(arr) {
      var filter = arr.filter(falsy);
      return filter;
    }

    bouncer([7, "ate", "", false, 9]);

Ответ 15

function removeFalsy(value){

  var val = Boolean(value);
  if(!val)
    return false;
  return true;
}

function bouncer(arr) {

  return arr.filter(removeFalsy);
}

bouncer([7, "ate", "", false, 9]);

Ответ 16

function bouncer(arr) {

    function filterFalse(value) {
        var a = Boolean(value);
        if (a === true) {
            return a;
        }
        return a;
    }

    function filterArray(x) {
        var y = filterFalse(x);
        if (y) {
            return true;
        } else {
            return false;
        }
    }

    var newArr = arr.filter(filterArray);
    return newArr;
}

bouncer([1, null, NaN, 2, undefined]);

Ответ 17

Это должно быть то, что вы ищете:

let array = [7, 'ate', '', false, 9, NaN];

function removeFalsyItems(array) {
   // Your result
   let filter = array.filter(Boolean);

   // Empty the array
   array.splice(0, array.length);

   // Push all items from the result to our array
   Array.prototype.push.apply(array, filter);

   return array
}

removeFalsyItems(array) // => [7, 'ate', 9], funny joke btw...

Ответ 18

Lodash может хорошо с этим справиться, есть функция _.compact().

const arr = [7, "ate", "", false, 9, NaN];
console.log(_.compact(arr));
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.js"></script>

Ответ 19

Попробуйте использовать filter и Boolean:

let array = [7,"ate","",false,9];
array.filter((values) => {return Boolean(values) === true })

Ответ 20

Просто дважды отрицайте, чтобы "привести" к булеву. !NaN === true => !!NaN === false

    const truthy = arr.filter(o => !!o)

Ответ 21

function bouncer(arr) {

// Don't show a false ID to this bouncer.

for (var i = 0; i < arr.length; i++) {
        if (!arr[i]) {
            arr.splice(i, 1);
            i = i-1;
        }
    }
    return arr;

}

bouncer([7, "ate", "", false, 9]);