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