我有一个Javascript对象像:

var my_object = { a:undefined, b:2, c:4, d:undefined };

如何删除所有未定义的属性?False属性应该保留。


当前回答

你可以简单地用_连接_.省略()。isUndefined和_。isNull组合,并获得懒惰求值的结果。

Demo

var result = _(my_object).omit(_.isUndefined).omit(_.isNull).value();

2016年3月14日更新:

正如dylants在评论部分中提到的,您应该使用_.omitBy()函数,因为它使用谓词而不是属性。对于lodash 4.0.0及以上版本,您应该使用此选项。

DEMO

var result = _(my_object).omitBy(_.isUndefined).omitBy(_.isNull).value();

2016年6月1日更新:

正如Max Truxa所评论的,lodash已经提供了一个替代的_。isNil,检查null和undefined:

var result = _.omitBy(my_object, _.isNil);

其他回答

你可以使用lodash来删除null和未定义的对象,但你应该知道你需要使用什么lodash方法,许多开发人员使用isNil来删除null和未定义的对象,但这个函数不删除空对象(' ')

你可以使用isEmpty来删除Null, Undefined和

import pickBy from 'lodash/fp/pickBy'
import negate from 'lodash/negate';
import isEmpty from 'lodash/isEmpty';

const omitNullish = pickBy(negate(isEmpty));

      addressObject = {
      "a": null,
      "c": undefined,
      "d": "",
      "e": "test1",
      "f": "test2
    }

 const notNullObjects = omitNullish(addressObject);
 
 console.log(notNullObjects); 

你将拥有这个对象:{ “e”:“test1”, “f”:“test2 }

以下是我采用的lodash方法:

_(my_object)
    .pairs()
    .reject(function(item) {
        return _.isUndefined(item[1]) ||
            _.isNull(item[1]);
    })
    .zipObject()
    .value()

函数的作用是:将输入对象转换为键/值数组数组。这样做是为了更容易使用reject()来消除未定义值和空值。之后,剩下的是没有被拒绝的对,这些是zipObject()的输入,它为您重建对象。

省略所有假值,但保留布尔原语,这个解决方案有帮助。

_.omitBy(fields, v => (_.isBoolean(v)||_.isFinite(v)) ? false : _.isEmpty(v));

让田野= str:’CAD’, numberStr:’123’, 123号, boolStrT:’true’, boolStrF:’false’, 假的,假的, 真实, undef: undefined, mo:零, emptyStr:”, 阵列:[1,2,3], emptyArr: [] ); 让诺布= _。omitBy (fields, v = > (_ isBoolean (v) | | _ isFinite (v)) ?伪造:_.isEmpty(v); 游戏机。log (nobj); < script src =“https://cdn.jsdelivr.net/npm/lodash@4。11月17日/ lodash min。主持人" > / < script >

可以这样做

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”,“0”,空字符串,{}。因此,为了使其简单易懂,我选择使用上面编码的显式比较。

正确答案是:

_.omitBy({ a: null, b: 1, c: undefined, d: false }, _.isNil)

结果是:

{b: 1, d: false}

其他人给出的另一种说法:

_.pickBy({ a: null, b: 1, c: undefined, d: false }, _.identity);

也将删除这里不需要的假值。