programing

lodash를 사용하여 개체에서 정의되지 않은 값과 null 값을 제거하려면 어떻게 해야 합니까?

goodsources 2022. 10. 30. 11:12
반응형

lodash를 사용하여 개체에서 정의되지 않은 값과 null 값을 제거하려면 어떻게 해야 합니까?

다음과 같은 Javascript 오브젝트가 있습니다.

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

정의되지 않은 속성을 모두 제거하려면 어떻게 해야 합니까?잘못된 속성은 남아 있어야 합니다.

쇠사슬만 하면 ._.omit()_.isUndefined ★★★★★★★★★★★★★★★★★」_.isNull을 사용하다

데모

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

2016년 3월 14일 갱신:

주석 섹션에서 dylants에서 언급했듯이 함수에는 속성 대신 술어가 사용되므로 함수를 사용해야 합니다.Lodash 버전에 사용해야 합니다.4.0.0상입니니다다

데모

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

2016년 6월 1일 갱신:

Max Truxa가 코멘트한 바와 같이, lodash는 이미 두 가지를 모두 체크하는 대안을 제공했습니다.null ★★★★★★★★★★★★★★★★★」undefined:

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

모든 falsey 값을 삭제하는 가장 간단한 방법은 다음과 같습니다.

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}

정답은 다음과 같습니다.

_.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여기서 바람직하지 않은 값입니다.

사용하고 lodash를 사용할 수 ._.compact(array)이치노

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

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

그냥:

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

되지 않은 과 null( lodash 4는 null( lodash 4는 null(그리고 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))

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

JavaScript: (Object.entries) ES7, Object.assign ES6(ES5)..도 실행 가능해야 ).또한 주의해 주십시오.v != nullundefined를 확인합니다.

> 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 오브젝트가 있는 버전입니다.키만: 단, 일반적으로 노드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월 업데이트: 노드 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 }

또는 1회 이내만 감소:

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

개체에서 정의되지 않은 문자열, null 문자열 및 빈 문자열을 제거하려면 다음과 같이 하십시오.

_.omitBy(object, (v) => _.isUndefined(v) || _.isNull(v) || v === '');

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로(배열에서 발견된 경우) 관측 중단됩니다."

여러분 중 일부는 이 질문에서 특히 삭제만 고려하고 있을 수 있기 때문입니다. undefined , , 을하세요.

  • 로다시 방법의 조합

    _.omitBy(object, _.isUndefined)
    
  • 패키지(삭제만 가능)undefined (프로퍼티)

    rundef(object)
    

재귀적으로 삭제할 필요가 있는 경우undefined속성, 패키지에는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 }

JSBin의 예

Array.protype과 함께 Object.entries를 사용할 수도 있습니다.필터링을 실시합니다.

const omitNullish = (object) => 
   Object.fromEntries(
       Object.entries(object).filter(([, value]) => value != null)
   )

omitNullish({ a: null, b: 1, c: undefined, d: false, e: 0 }) // { b: 1, d: false, e: 0}

으로 lodash를 할 수 .fp/pickBy isNil ★★★★★★★★★★★★★★★★★」negate.

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


const omitNullish = pickBy(negate(isNil))

omitNullish({ a: null, b: 1, c: undefined, d: false, e: 0 }) // { b: 1, d: false, e: 0}

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

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

삭제할 항목을 완전히 제어할 수 있기 때문에 _.pickBy를 사용하는 것이 좋습니다.

var person = {"name":"bill","age":21,"sex":undefined,"height":null};

var cleanPerson = _.pickBy(person, function(value, key) {
  return !(value === undefined || value === null);
});

출처 : https://www.codegrepper.com/ ? search _ term = lodash + remove + values + from + object

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

그렇지 않으면 vanilla 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];
    }
});

"정의되지 않은" 또는 "null"이 거부될 뿐만 아니라 "false", "0", 빈 문자열 {}과 같은 다른 거짓 값도 있으므로 false 테스트를 사용하지 마십시오.따라서 단순하고 이해하기 쉽게 하기 위해 위의 코드와 같이 명시적인 비교를 선택했습니다.

이 솔루션은 모든 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>

최단 경로(Loadash v4):

_.pickBy(my_object)

삭제하지 않을 경우false가치.다음은 예를 제시하겠습니다.

obj = {
  "a": null,
  "c": undefined,
  "d": "a",
  "e": false,
  "f": true
}
_.pickBy(obj, x => x === false || x)
> {
    "d": "a",
    "e": false,
    "f": true
  }
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}

jsbin.

깊이 중첩된 개체 및 배열에 사용됩니다.문자열 및 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"
}

여러 개체에서 제거하려는 경우 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' }]

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

하나의 lodash 기능을 가진 어레이를 포함하는 심층 객체에서도 이 작업을 수행할 수 있었습니다.transform.

이중 구분(!= null)은 정의되지 않은 항목과 일치하므로 의도적인 것이며, 개체와 배열 모두와 일치하므로 'object' 검사 유형도 마찬가지입니다.

이는 클래스를 포함하지 않는 일반 데이터 개체에만 사용할 수 있습니다.

const cloneDeepSanitized = (obj) =>
  Array.isArray(obj)
    ? obj.filter((entry) => entry != null).map(cloneDeepSanitized)
    : transform(
        obj,
        (result, val, key) => {
          if (val != null) {
            result[key] =
              typeof val === 'object' ? cloneDeepSanitized(val) : val;
          }
        },
        {},
      );

lodash를 사용하여 늘 및 정의되지 않은 개체를 삭제할 수 있지만 사용할 lodash 메서드를 알아야 합니다.많은 dev는 isNil을 사용하여 Null 및 정의되지 않은 개체를 삭제하지만 이 함수는 빈 개체(' ')를 삭제하지 않습니다.

is Empty를 사용하여 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 }

언급URL : https://stackoverflow.com/questions/30812765/how-to-remove-undefined-and-null-values-from-an-object-using-lodash

반응형