lodash를 사용하여 객체에서 정의되지 않은 null 값을 제거하는 방법은 무엇입니까?


172

다음과 같은 Javascript 객체가 있습니다.

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

정의되지 않은 속성을 모두 제거하는 방법? 거짓 속성은 유지해야합니다.

답변:


195

모든 잘못된 값 을 제거 하려면 가장 간단한 방법은 다음과 같습니다.

내용은 나중에 Lodash 4.x 및 :

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

대한 기존 Lodash 3.x를 :

_.pick(obj, _.identity);

_.pick({ a: null, b: 1, c: undefined }, _.identity);
>> Object {b: 1}

63
lodash 4에서는 다음과 같아야합니다._.pickBy(obj, _.identity);
Tom Spencer

30
Plaese는이 방법으로도 잘못된 값을 제거합니다.
무제한

12
조심하십시오, 이것은 false가치가있는 부울 재산을 제거합니다
Sai Ram

6
false를 제거하는 것 외에도 0과 ''를 값으로 사용하여 속성을 제거합니다 ... 좋은 생각이 아닙니다.
Federico Budassi

4
이 답변은 잘못된 값을 제거하기 때문에 상관이 없습니다. 아래에서 내 대답을 확인하십시오.
Tiago Bértolo

224

간단히 컴포지션 _.omit()과 연결 _.isUndefined하고 _.isNull게으른 평가로 결과를 얻을 수 있습니다.

데모

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

2016 년 3 월 14 일 업데이트 :

주석 섹션에서 dylants 가 언급했듯이 , _.omitBy()함수 대신 속성을 사용하므로 함수를 사용해야합니다 . lodash 버전 4.0.0이상에서 사용해야합니다 .

데모

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

2016 년 6 월 1 일 업데이트 :

하여 주석 같이 최대 Truxa 이미 대체 제공 lodash _.isNil모두에 대한 검사 nullundefined:

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

7
최신 버전의 lodash를 사용하는 사용자는 omitBy대신이 함수를 사용해야합니다 omit. 그래서_(my_object).omitBy(_.isUndefined).omitBy(_.isNull).value();
dylants

31
lodash 4.0.0부터는 _.isNilchaining 대신 _.isUndefined및을 사용할 수 있습니다 _.isNull. var result = _.omitBy(my_object, _.isNil);
졌습니다

@ MaxTruxa "Nil"값을 재귀 적으로 확인하기 위해 어떻게 수정합니까?
aegyed

1
Lodash omitBy는보다 성능이 떨어 pickBy지므로 후자가 선호되고 iteratee 함수의 조건이 역전됩니다. 위의 대답은 그 권리를 얻었습니다.
Ernesto

1
OP의 질문 만 지정 null하고 undefined값을 지정했습니다 . identity조건은 제거 할 것이다 false당신은 단순히 내 대답과 질문의 의도 다음 내가 볼 수없는 문제에 그것을 기반 그렇다면, 값을. 또한 "성능"에 대해 다루는 경우 기본적으로 부정 술어를 사용하여 omitBy호출 하면됩니다. 따라서 성능면에서 너무 작아서 의미가 없습니다. pickByidentity
ryeballar

38

lodash를 사용 _.compact(array)하는 경우 배열에서 모든 잘못된 값을 제거 하는 데 사용할 수 있습니다 .

_.compact([0, 1, false, 2, '', 3]);
// => [1, 2, 3]

https://lodash.com/docs/4.17.4#compact


36
컴팩트 한 배열에 적용하지만, 문제는 개체에 대한 인
guidoman

1
0을 유지하고 싶지 않다면.
Sammi

2
@ Sammi, _.pickBy(object, _.isNumber)그 경우에 사용할 수 있습니다 .
John Rix

1
@Herick에게 감사합니다. 작동합니다. 나 이제 자러 갈거야.
technophyle

1
@ technophyle, 나는 당신에게 동의합니다 (그리고 나는이 대답을 쓴 사람입니다). 그러나 적어도이 답변은 일부 사람들의 문제를 해결하기 때문에 여기에 유지하고 있습니다.
JavaFish

25

정답은 다음과 같습니다.

_.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여기서 원하지 않는 값 도 제거 합니다.


{"a":1,"b":{"a":1,"b":null,"c":undefined}}, object.b 속성 b'c'는 제거되지 않습니다
mqliutie

예상대로 @mqliutie.
Tiago Bértolo

18

다만:

_.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); }));

8
이것은 Lodash v.3 용입니다. v.4의 경우을 사용해야 _.omitBy합니다.
PhiLho

16

다른 답변을 완료하려면 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>


1
이것은 당신이 제거하지 않으려면 가장 좋은 방법입니다 0, '', false값을. 또한 콜백을로 단축 할 수 있습니다 v => v != null.
SimpleJ

2
간단한 해결책. 감사합니다.
Arjun G Perambra

10

lodash 문서에 따르면 :

_.compact(_.map(array, fn))

또한 모든 null을 필터링 할 수 있습니다


6

깊게 중첩 된 객체의 경우 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
};

5

undefined객체에서 깊이 제거하는 것과 비슷한 문제가 발생 하여 일반 오래된 객체를 변환하고 JSON을 사용할 수 있으면 빠르고 더러운 도우미 함수가 다음과 같습니다.

function stripUndefined(obj) {
  return JSON.parse(JSON.stringify(obj));
}

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify#Description

"... 정의되지 않은 함수 나 기호가 변환 중에 발생하면 생략되거나 (객체에서 발견 될 때) null로 검열됩니다 (배열에서 발견 될 때)."


5

순수한 JavaScript로 : (Object.entries는 ES7이지만 Object.assign은 ES6이지만 동등한 ES5는 Object.keys 만 사용 가능합니다); 또한 v != nullnull과 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 만있는 버전입니다. 그러나 일반적으로 Node v8의 ES7은 꽤 즐겁습니다. ;-)

> 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 년 10 월 업데이트 : 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로 할 수 있다면 타사 라이브러리 종속성을 피할 수 있습니다.


object.fromEntries 를 사용하여 reduce 사용을 피할 수 있습니다 . Object.fromEntries (Object.entries (d) .filter (([k, v]) => (v! = null)))
ppierre

5

귀하 중 일부는 구체적으로 제거하려는 질문에 도달했을 undefined수 있으므로 다음을 사용할 수 있습니다.

  • Lodash 방법의 조합

    _.omitBy(object, _.isUndefined)
  • 속성 rundef만 제거 하는 패키지undefined

    rundef(object)

속성 을 재귀 적으로 제거 해야하는 경우 패키지에도 옵션이 있습니다.undefinedrundefrecursive

rundef(object, false, true);

자세한 내용은 설명서 를 참조하십시오.


3

내가 취하는 lodash 접근법은 다음과 같습니다.

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

쌍 () 함수는 키 / 값 배열의 배열에 입력 오브젝트 변. 거부 () 를 사용하여 값 을 제거 undefined하고 제거 하기가 쉽도록이 작업을 수행 null합니다. 그 후에, 당신은 거부되지 않은 쌍을 남겨두고 , 그것들은 당신을 위해 당신의 객체를 재구성하는 zipObject ()에 대한 입력입니다 .


3

undefined == null다음과 같이 작성할 수 있다는 점을 고려하십시오 .

let collection = {
  a: undefined,
  b: 2,
  c: 4,
  d: null,
}

console.log(_.omit(collection, it => it == null))
// -> { b: 2, c: 4 }

JSBin 예제


1
이것을 재검토 ... 이유는 확실하지 않지만 이번에는 _.omitBy를 사용해야했습니다 ... json = _.omitBy (json, (it) => it == null);
danday74

2

pickBy 는 기본적으로 ID 를 사용합니다 .

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

나는이 짧은 버전의 @ Tx3의 답변을 좋아한다. 잘 작동합니다!
Jordan


1

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];
    }
});

"정의되지 않은"또는 "널"이 거부 될 뿐만 아니라 "거짓", "0", 빈 문자열, {}과 같은 다른 잘못된 값도 있으므로 잘못된 테스트를 사용하지 마십시오 . 따라서 간단하고 이해하기 쉽게하기 위해 위에서 설명한대로 명시 적 비교를 사용하기로 결정했습니다.


1
이것은 재귀 적이 지 않습니다
user3743222

1

모두 생략 할 falsey의 값을 하지만 이 솔루션 도움이 부울 프리미티브를 유지한다.

_.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/lodash@4.17.11/lodash.min.js"></script>


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 }

1
_.reject는 입력을 JSON이 아닌 배열 (키가 아닌 값만 고려)로 취급합니다. 결과 newObject는 {b : 2, c : 4}가 아닌 [2,4]입니다. 또한 "널"키를 거부하지 않습니다.
TaoPR

0

밑줄을 사용하고 빈 문자열도 관리합니다.

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}

jsbin .


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"
}


0

객체 배열에서 제거하고 lodash를 사용하려는 경우 다음과 같이 할 수 있습니다.


 const objects = [{ a: 'string', b: false, c: 'string', d: undefined }]
 const result = objects.map(({ a, b, c, d }) => _.pickBy({ a,b,c,d }, _.identity))

 // [{ a: 'string', c: 'string' }]

참고 : 원하지 않으면 파괴 할 필요가 없습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.