[javascript] Underscore.js를 사용하여 개체에서 빈 속성 / 잘못된 값 제거

여러 속성을 가진 개체가 있습니다. 잘못된 값이있는 속성을 제거하고 싶습니다.

이것은 compact배열에서 얻을 수 있지만 객체는 어떻습니까?



답변

자신 만의 밑줄 플러그인 (mixin)을 만들 수 있습니다.

_.mixin({
  compactObject: function(o) {
    _.each(o, function(v, k) {
      if(!v) {
        delete o[k];
      }
    });
    return o;
  }
});

그런 다음 기본 밑줄 방법으로 사용하십시오.

var o = _.compactObject({
  foo: 'bar',
  a: 0,
  b: false,
  c: '',
  d: null,
  e: undefined
});

최신 정보

같이 @AndreiNeculau는 지적 원래하지만,이 믹스 인은, 원래 객체에 영향을 미치는 compact밑줄 방법은 배열의 카피를 돌려줍니다 .
이 문제를 해결하고 사촌compactObject 처럼 행동하도록 하기 위해 다음과 같은 사소한 업데이트가 있습니다.

_.mixin({
  compactObject : function(o) {
     var clone = _.clone(o);
     _.each(clone, function(v, k) {
       if(!v) {
         delete clone[k];
       }
     });
     return clone;
  }
});


답변

Underscore 버전 1.7.0부터 다음을 사용할 수 있습니다 _.pick.

_.pick(sourceObj, _.identity)

설명

두 번째 매개 변수 _.pick는 값 선택을위한 술어 함수가 될 수 있습니다. 술어가 진실 을 리턴하는 값 이 선택되고 술어가 거짓 을 리턴하는 값 은 무시됩니다.

선택 _.pick (객체, * 키)

화이트리스트에있는 (또는 유효한 키의 배열)에 대한 값만 갖도록 필터링 된 객체 의 복사본을 반환합니다 . 또는 선택할 키를 나타내는 술어를 승인합니다.

_.identity첫 번째 인수를 반환하는 도우미 함수입니다. 즉, 진실 값을 선택하고 거짓 값을 거부하는 조건 자 함수로도 작동합니다. Underscore 라이브러리는 예를 들어 다른 술어와 함께 제공됩니다._.pick(sourceObj, _.isBoolean) 부울 속성 만 유지합니다.

이 기술을 많이 사용하는 경우 좀 더 표현력이있게 만들 수 있습니다.

var pickNonfalsy = _.partial(_.pick, _, _.identity); // Place this in a library module or something
pickNonfalsy(sourceObj);

밑줄 버전 1.6.0도 제공 _.pick되었지만 화이트리스트 대신 조건 자 함수를 허용하지 않았습니다.


답변

퀵앤 클리어 : _.omitBy( source, i => !i );

이것은 Emil의 대답에 역으로 언급됩니다. 이런 식으로 imho는 더 명확하게 읽습니다. 더 자명합니다.

ES6의 고급 스러움이 없다면 약간 덜 깨끗합니다. _.omitBy( source, function(i){return !i;});

번갈아 하는: _.omitBy( source, _.isEmpty)

진실성 _.isEmpty대신을 사용 하면 컬렉션에서 빈 배열과 객체를 편리하게 제거 할 수 있으며 아마도 숫자와 날짜를 불편하게 제거 할 수 있습니다 . 따라서 결과는 OP의 질문에 대한 정확한 대답은 아니지만 빈 컬렉션을 제거하려는 경우 유용 할 수 있습니다._.identity


답변

lodash의 변형 으로

_.transform(obj, function(res, v, k) {
  if (v) res[k] = v;
});


답변

Object.keys(o).forEach(function(k) {
    if (!o[k]) {
        delete o[k];
    }
});


답변

얕은 클론을 생성 할 수 있습니다.

_(obj).reduce(function(a,v,k){
     if(v){ a[k]=v; }
     return a;
},{});


답변

개체 사용 삭제.

for(var k in obj){

  if(obj.hasOwnProperty(k) && !obj[k]){
    delete obj[k];
  }
}