У меня есть объект Javascript, как:
var my_object = { a:undefined, b:2, c:4, d:undefined };
 Как удалить все неопределенные свойства? Ложные атрибуты должны остаться.
У меня есть объект Javascript, как:
var my_object = { a:undefined, b:2, c:4, d:undefined };
 Как удалить все неопределенные свойства? Ложные атрибуты должны остаться.
Если вы хотите удалить все значения Falsey, то самый компактный способ:
_.pick(obj, _.identity);
 Например (Lodash 3.x):
_.pick({ a: null, b: 1, c: undefined }, _.identity);
>> Object {b: 1}
 Для Lodash 4.x:
_.pickBy({ a: null, b: 1, c: undefined }, _.identity);
>> Object {b: 1}
		Вы можете просто соединить _.omit() с композициями _.isUndefined и _.isNull и получить результат с ленивой оценкой.
var result = _(my_object).omit(_.isUndefined).omit(_.isNull).value();
Обновление от 14 марта 2016 г.:
Как упоминалось  dylants в разделе комментариев, вы должны использовать  _.omitBy(), поскольку вместо свойства используется предикат. Вы должны использовать это для версии lodash 4.0.0 и выше.
var result = _(my_object).omitBy(_.isUndefined).omitBy(_.isNull).value();
Обновление 1 июня 2016 года:
Как прокомментировано  Max Truxa, lodash уже предоставил альтернативу _.isNil.
var result = _.omitBy(my_object, _.isNil);
		 если вы используете lodash, вы можете использовать _.compact(array) для удаления всех ложных значений из массива.
_.compact([0, 1, false, 2, '', 3]);
// => [1, 2, 3]
		Просто:
_.omit(my_object, _.isUndefined)
Вышеприведенное не учитывает значения null, поскольку они отсутствуют в исходном примере и упоминаются только в теме, но я оставляю его как он изящный и может иметь свои применения.
Вот полный пример, менее краткий, но более полный.
var obj = { a: undefined, b: 2, c: 4, d: undefined, e: null, f: false, g: '', h: 0 };
console.log(_.omit(obj, function(v) { return _.isUndefined(v) || _.isNull(v); }));
		 Чтобы завершить другие ответы, в lodash 4, чтобы игнорировать только undefined и null (а не свойства, такие как false), вы можете использовать предикат в _.pickBy:
 _.pickBy(obj, v !== null && v !== undefined)
Пример ниже:
const obj = { a: undefined, b: 123, c: true, d: false, e: null};
const filteredObject = _.pickBy(obj, v => v !== null && v !== undefined);
console.log = (obj) => document.write(JSON.stringify(filteredObject, null, 2));
console.log(filteredObject); <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.10/lodash.js"></script>		В соответствии с документами lodash:
_.compact(_.map(array, fn))
Также вы можете отфильтровать все нули
Я столкнулся с аналогичной проблемой с удалением undefined из объекта (глубоко) и обнаружил, что если вы в порядке, чтобы преобразовать свой простой старый объект и использовать JSON, быстрая и грязная вспомогательная функция будет выглядеть так:
function stripUndefined(obj) {
  return JSON.parse(JSON.stringify(obj));
}
"... Если undefined, во время преобразования встречается функция или символ, она либо опускается (когда она найдена в объекте), либо подвержена цензуре нулевой (когда она найдена в массиве)".
 Поскольку некоторые из вас, возможно, пришли к вопросу о том, чтобы специально удалить только undefined, вы можете использовать:
комбинация методов Лодаша
_.omitBy(object, _.isUndefined)
 пакет  rundef, который удаляет только undefined свойства
rundef(object)
 Если вам нужно рекурсивно удалить undefined свойства, пакет  rundef также имеет recursive опцию.
rundef(object, false, true);
 Смотрите документацию для более подробной информации.
Вот подход lodash, который я возьму:
_(my_object)
    .pairs()
    .reject(function(item) {
        return _.isUndefined(item[1]) ||
            _.isNull(item[1]);
    })
    .zipObject()
    .value()
Функция pairs() превращает входной объект в массив массивов ключей/значений. Вы делаете это так, чтобы было проще использовать reject() для устранения значений undefined и null. После этого вы останетесь с парами, которые не были отклонены, и это вход для zipObject(), который восстанавливает ваш объект для вас.
Учитывая, что undefined == null, мы можем написать следующее:
let collection = {
  a: undefined,
  b: 2,
  c: 4,
  d: null,
}
console.log(_.omit(collection, it => it == null))
// -> { b: 2, c: 4 }
		с чистым JavaScript: (хотя Object.entries - ES7, Object.assign - ES6, но эквивалентный ES5 использует Object.keys, также должен выполняться); также обратите внимание, что v != null проверяет как null, так и undefined;
> var d = { a:undefined, b:2, c:0, d:undefined, e: null, f: 0.3, s: "", t: false };
undefined
> Object.entries(d)
    .filter(([ k, v ]) => (v != null))
    .reduce((acc, [k, v]) => Object.assign(acc, {[k]: v}), {})
{ b: 2, c: 0, f: 0.3, s: '', t: false }
Изменить: ниже приведена версия только с ES5 Object.keys: но в целом с ES7 в Node v8 довольно приятно, -)
> Object.keys(d)
    .filter(function(k) { return d[k] != null; })
    .reduce(function(acc, k) { acc[k] = d[k]; return acc; }, {});
{ b: 2, c: 0, f: 0.3, s: '', t: false }
Обновление в октябре 2017 года: с Node v8 (начиная с версии v8.3 или около того) теперь у него есть объект, расширяющий конструкцию:
> var d = { a:undefined, b:2, c:0, d:undefined,
    e: null, f: -0.0, s: "", t: false, inf: +Infinity, nan: NaN };
undefined
> Object.entries(d)
    .filter(([ k, v ]) => (v != null))
    .reduce((acc, [k, v]) => ({...acc, [k]: v}), {})
{ b: 2, c: 0, f: -0, s: '', t: false, inf: Infinity, nan: NaN }
или только в одном снижении:
> Object.entries(d)
   .reduce((acc, [k, v]) => (v==null ? acc : {...acc, [k]: v}), {})
{ b: 2, c: 0, f: -0, s: '', t: false, inf: Infinity, nan: NaN }
Обновление: кто-то хочет рекурсивный? тоже не так сложно, просто нужно выполнить дополнительную проверку isObject и рекурсивно назвать себя:
> function isObject(o) {
    return Object.prototype.toString.call(o) === "[object Object]"; }
undefined
> function dropNullUndefined(d) {
    return Object.entries(d)
      .reduce((acc, [k, v]) => (
        v == null ? acc :
         {...acc, [k]: (isObject(v) ? dropNullUndefined(v) : v) }
      ), {});
  }
> dropNullUndefined({a: 3, b:null})
{ a: 3 }
> dropNullUndefined({a: 3, b:null, c: { d: 0, e: undefined }})
{ a: 3, c: { d: 0 } }
мой вывод: если бы чистый Javascript мог делать, я бы избегал любых зависимостей сторонних библиотек:
Для глубоко вложенного объекта вы можете использовать мой фрагмент для lodash> 4
const removeObjectsWithNull = (obj) => {
    return _(obj)
      .pickBy(_.isObject) // get only objects
      .mapValues(removeObjectsWithNull) // call only for values as objects
      .assign(_.omitBy(obj, _.isObject)) // save back result that is not object
      .omitBy(_.isNil) // remove null and undefined from object
      .value(); // get value
};
		С помощью lodash (или подчеркивания) вы можете сделать
var my_object = { a:undefined, b:2, c:4, d:undefined, e:null };
var passedKeys = _.reject(Object.keys(my_object), function(key){ return _.isUndefined(my_object[key]) || _.isNull(my_object[key]) })
newObject = {};
_.each(passedKeys, function(key){
    newObject[key] = my_object[key];
});
В противном случае с помощью ванильного JavaScript вы можете сделать
var my_object = { a:undefined, b:2, c:4, d:undefined };
var new_object = {};
Object.keys(my_object).forEach(function(key){
    if (typeof my_object[key] != 'undefined' && my_object[key]!=null){
        new_object[key] = my_object[key];
    }
});
Не использовать ложный тест, потому что не будет отклонено не только "undefined" или "null" , но и другое значение false, например "false", "0", пустая строка, {}. Таким образом, просто чтобы сделать его простым и понятным, я решил использовать явное сравнение, как указано выше.
var my_object = { a:undefined, b:2, c:4, d:undefined };
var newObject = _.reject(my_collection, function(val){ return _.isUndefined(val) })
//--> newCollection = { b: 2, c: 4 }
		Я бы использовал символ подчеркивания и заботился о пустых строках:
var my_object = { a:undefined, b:2, c:4, d:undefined, k: null, p: false, s: '', z: 0 };
var result =_.omit(my_object, function(value) {
  return _.isUndefined(value) || _.isNull(value) || value === '';
});
console.log(result); //Object {b: 2, c: 4, p: false, z: 0}		Для глубоко вложенных объектов и массивов. и исключить пустые значения из строки и NaN
function isBlank(value) {
  return _.isEmpty(value) && !_.isNumber(value) || _.isNaN(value);
}
var removeObjectsWithNull = (obj) => {
  return _(obj).pickBy(_.isObject)
    .mapValues(removeObjectsWithNull)
    .assign(_.omitBy(obj, _.isObject))
    .assign(_.omitBy(obj, _.isArray))
    .omitBy(_.isNil).omitBy(isBlank)
    .value();
}
var obj = {
  teste: undefined,
  nullV: null,
  x: 10,
  name: 'Maria Sophia Moura',
  a: null,
  b: '',
  c: {
    a: [{
      n: 'Gleidson',
      i: 248
    }, {
      t: 'Marta'
    }],
    g: 'Teste',
    eager: {
      p: 'Palavra'
    }
  }
}
removeObjectsWithNull(obj)
 результат:
{
   "c": {
      "a": [
         {
            "n": "Gleidson",
            "i": 248
         },
         {
            "t": "Marta"
         }
      ],
      "g": "Teste",
      "eager": {
         "p": "Palavra"
      }
   },
   "x": 10,
   "name": "Maria Sophia Moura"
}
		Правильный ответ:
_.omitBy({ a: null, b: 1, c: undefined, d: false }, _.isNil)
 Это приводит к:
{b: 1, d: false}
 Альтернатива, данная здесь другими людьми:
_.pickBy({ a: null, b: 1, c: undefined, d: false }, _.identity);
  Удалит также false значения, которые здесь не нужны.
pickBy использует идентичность по умолчанию:
_.pickBy({ a: null, b: 1, c: undefined, d: false });
		Это решение помогает опустить все ложные значения, но оставить логические примитивы.
_.omitBy(fields, v => (_.isBoolean(v)||_.isFinite(v)) ? false : _.isEmpty(v));
 
let fields = {
str: 'CAD',
numberStr: '123',
number  : 123,
boolStrT: 'true',
boolStrF: 'false',
boolFalse : false,
boolTrue  : true,
undef: undefined,
nul: null,
emptyStr: '',
array: [1,2,3],
emptyArr: []
};
let nobj = _.omitBy(fields, v => (_.isBoolean(v)||_.isFinite(v)) ? false : _.isEmpty(v));
console.log(nobj); <script src="https://cdn.jsdelivr.net/npm/[email protected]/lodash.min.js"></script>