Javascript의 객체에서 빈 속성 제거
JavaScript 객체에 undefined
있거나 null
JavaScript 객체에있는 모든 속성을 어떻게 제거 합니까?
(질문과 유사한 이 하나의 배열에 대한)
객체를 반복 할 수 있습니다.
var test = {
test1 : null,
test2 : 'somestring',
test3 : 3,
}
function clean(obj) {
for (var propName in obj) {
if (obj[propName] === null || obj[propName] === undefined) {
delete obj[propName];
}
}
}
clean(test);
이 속성 제거가 객체의 proptype chain을 실행하지 않는 것에 대해 우려되는 경우,
function clean(obj) {
var propNames = Object.getOwnPropertyNames(obj);
for (var i = 0; i < propNames.length; i++) {
var propName = propNames[i];
if (obj[propName] === null || obj[propName] === undefined) {
delete obj[propName];
}
}
}
null 대 undefined에 대한 몇 가지 참고 사항 :
test.test1 === null; // true
test.test1 == null; // true
test.notaprop === null; // false
test.notaprop == null; // true
test.notaprop === undefined; // true
test.notaprop == undefined; // true
일부 ES6 / ES2015 사용 :
1) 간단한 원 라이너로 할당없이 항목을 인라인 으로 제거합니다 .
Object.keys(myObj).forEach((key) => (myObj[key] == null) && delete myObj[key]);
2) 이 예는 제거되었습니다 ...
3) 함수로 작성된 첫 번째 예 :
const removeEmpty = obj => {
Object.keys(obj).forEach(key => obj[key] == null && delete obj[key]);
};
4)이 함수는 재귀 를 사용 하여 중첩 된 객체에서 항목을 삭제합니다.
const removeEmpty = obj => {
Object.keys(obj).forEach(key => {
if (obj[key] && typeof obj[key] === "object") removeEmpty(obj[key]); // recurse
else if (obj[key] == null) delete obj[key]; // delete
});
};
4b) 이것은 4)와 비슷하지만 소스 객체를 직접 변경하는 대신 새 객체를 반환합니다.
const removeEmpty = obj => {
const newObj = {};
Object.keys(obj).forEach(key => {
if (obj[key] && typeof obj[key] === "object") {
newObj[key] = removeEmpty(obj[key]); // recurse
} else if (obj[key] != null) {
newObj[key] = obj[key]; // copy value
}
});
return newObj;
};
5) 기능 을 기반 4B에 접근) MichaelJ.Zoidl의 대답은 @ 사용 filter()
하고 reduce()
. 이것도 새로운 객체를 반환합니다 :
const removeEmpty = obj =>
Object.keys(obj)
.filter(k => obj[k] != null) // Remove undef. and null.
.reduce(
(newObj, k) =>
typeof obj[k] === "object"
? { ...newObj, [k]: removeEmpty(obj[k]) } // Recurse.
: { ...newObj, [k]: obj[k] }, // Copy value.
{}
);
6) 4)와 동일하지만 ES7 / 2016 과 동일 Object.entries()
합니다.
const removeEmpty = (obj) =>
Object.entries(obj).forEach(([key, val]) => {
if (val && typeof val === 'object') removeEmpty(val)
else if (val == null) delete obj[key]
})
5b) 재귀를 사용하고 ES2019 로 새 객체를 반환하는 다른 기능 버전 : Object.fromEntries()
const removeEmpty = obj =>
Object.fromEntries(
Object.entries(obj)
.filter(([k, v]) => v != null)
.map(([k, v]) => (typeof v === "object" ? [k, removeEmpty(v)] : [k, v]))
);
7) 4)와 동일하지만 일반 ES5 :
function removeEmpty(obj) {
Object.keys(obj).forEach(function(key) {
if (obj[key] && typeof obj[key] === 'object') removeEmpty(obj[key])
else if (obj[key] == null) delete obj[key]
});
};
lodash 또는 underscore.js를 사용하는 경우 간단한 해결책은 다음과 같습니다.
var obj = {name: 'John', age: null};
var compacted = _.pickBy(obj);
이것은 lodash 4, pre lodash 4 또는 underscore.js에서만 작동합니다 _.pick(obj, _.identity)
.
누군가 Owen과 Eric의 재귀 버전이 필요한 경우 다음과 같습니다.
/**
* Delete all null (or undefined) properties from an object.
* Set 'recurse' to true if you also want to delete properties in nested objects.
*/
function delete_null_properties(test, recurse) {
for (var i in test) {
if (test[i] === null) {
delete test[i];
} else if (recurse && typeof test[i] === 'object') {
delete_null_properties(test[i], recurse);
}
}
}
JSON.stringify는 정의되지 않은 키를 제거합니다.
removeUndefined = function(json){
return JSON.parse(JSON.stringify(json))
}
당신은 아마 delete
키워드를 찾고 있습니다.
var obj = { };
obj.theProperty = 1;
delete obj.theProperty;
JSON.stringify
replacer 매개 변수 의 조합을 사용하여 JSON.parse
다시 객체로 전환 할 수 있습니다. 또한이 방법을 사용하면 중첩 된 개체 내의 모든 중첩 키가 교체됩니다.
예제 객체
var exampleObject = {
string: 'value',
emptyString: '',
integer: 0,
nullValue: null,
array: [1, 2, 3],
object: {
string: 'value',
emptyString: '',
integer: 0,
nullValue: null,
array: [1, 2, 3]
},
arrayOfObjects: [
{
string: 'value',
emptyString: '',
integer: 0,
nullValue: null,
array: [1, 2, 3]
},
{
string: 'value',
emptyString: '',
integer: 0,
nullValue: null,
array: [1, 2, 3]
}
]
};
대체 기능
function replaceUndefinedOrNull(key, value) {
if (value === null || value === undefined) {
return undefined;
}
return value;
}
물체 청소
exampleObject = JSON.stringify(exampleObject, replaceUndefinedOrNull);
exampleObject = JSON.parse(exampleObject);
ES6 + 용 최단 라이너
모든 잘못된 값을 필터링합니다 ( "", 0, false, null, undefined)
Object.entries(obj).reduce((a,[k,v]) => (v ? {...a, [k]:v} : a), {})
필터 만 null
Object.entries(obj).reduce((a,[k,v]) => (v === null ? a : {...a, [k]:v}), {})
정의되지 않은 필터 만
Object.entries(obj).reduce((a,[k,v]) => (v === undefined ? a : {...a, [k]:v}), {})
정의되지 않은 null 값을 필터링합니다.
Object.entries(obj).reduce((a,[k,v]) => (v == null ? a : {...a, [k]:v}), {})
null
및 undefined
값이 필터링 된 객체를 반환하는 가장 간단한 Lodash 솔루션 입니다.
_.omitBy(obj, _.isNil)
더 짧은 ES6 순수 솔루션은 배열로 변환하고 필터 기능을 사용하여 다시 객체로 변환합니다. 기능을 쉽게 만들 수 있습니다 ...
Btw. 이것을 사용 .length > 0
하여 빈 문자열 / 배열이 있는지 확인하므로 빈 키를 제거합니다.
const MY_OBJECT = { f: 'te', a: [] }
Object.keys(MY_OBJECT)
.filter(f => !!MY_OBJECT[f] && MY_OBJECT[f].length > 0)
.reduce((r, i) => { r[i] = MY_OBJECT[i]; return r; }, {});
JS BIN https://jsbin.com/kugoyinora/edit?js,console
사용 ramda 번호 pickBy 모든 제거 null
, undefined
및 false
값 :
const obj = {a:1, b: undefined, c: null, d: 1}
R.pickBy(R.identity, obj)
@manroe가 지적했듯이 false
값 을 유지 하려면 isNil()
다음을 사용하십시오 .
const obj = {a:1, b: undefined, c: null, d: 1, e: false}
R.pickBy(v => !R.isNil(v), obj)
.filter
필요 이상으로 더 많은 객체를 생성하거나 포함하지 않고 기능적이고 불변의 접근 방식
Object.keys(obj).reduce((acc, key) => (obj[key] === undefined ? acc : {...acc, [key]: obj[key]}), {})
순수한 ES7 솔루션의 4 줄을 원한다면 :
const clean = e => e instanceof Object ? Object.entries(e).reduce((o, [k, v]) => {
if (typeof v === 'boolean' || v) o[k] = clean(v);
return o;
}, e instanceof Array ? [] : {}) : e;
또는 더 읽기 쉬운 버전을 선호하는 경우 :
function filterEmpty(obj, [key, val]) {
if (typeof val === 'boolean' || val) {
obj[key] = clean(val)
};
return obj;
}
function clean(entry) {
if (entry instanceof Object) {
const type = entry instanceof Array ? [] : {};
const entries = Object.entries(entry);
return entries.reduce(filterEmpty, type);
}
return entry;
}
부울 값을 유지하고 배열도 정리합니다. 또한 정리 된 복사본을 반환하여 원본 개체를 유지합니다.
내 프로젝트에서 동일한 시나리오가 있으며 다음 방법을 사용하여 달성했습니다.
모든 데이터 유형에서 작동하지만 위에서 언급 한 것은 date 및 empty array에서는 작동하지 않습니다.
removeEmptyKeysFromObject.js
removeEmptyKeysFromObject(obj) {
Object.keys(obj).forEach(key => {
if (Object.prototype.toString.call(obj[key]) === '[object Date]' && (obj[key].toString().length === 0 || obj[key].toString() === 'Invalid Date')) {
delete obj[key];
} else if (obj[key] && typeof obj[key] === 'object') {
this.removeEmptyKeysFromObject(obj[key]);
} else if (obj[key] == null || obj[key] === '') {
delete obj[key];
}
if (obj[key]
&& typeof obj[key] === 'object'
&& Object.keys(obj[key]).length === 0
&& Object.prototype.toString.call(obj[key]) !== '[object Date]') {
delete obj[key];
}
});
return obj;
}
이 함수에 객체를 전달하십시오 removeEmptyKeysFromObject ()
제자리에서 변경하지 않고 null / undefined가 제거 된 클론을 반환하는 경우 ES6 reduce 함수를 사용할 수 있습니다.
// Helper to remove undefined or null properties from an object
function removeEmpty(obj) {
// Protect against null/undefined object passed in
return Object.keys(obj || {}).reduce((x, k) => {
// Check for null or undefined
if (obj[k] != null) {
x[k] = obj[k];
}
return x;
}, {});
}
당신은 !
조건으로 더 짧은 할 수 있습니다
var r = {a: null, b: undefined, c:1};
for(var k in r)
if(!r[k]) delete r[k];
사용법에서 기억 : @semicolor가 주석에서 알 수 있듯이 값이 빈 문자열 인 경우 속성을 삭제합니다. 거짓 또는 0
에 piggypack에 벤의 대답 lodash의를 사용하여이 문제를 해결하는 방법 _.pickBy
: 당신은 또한 자매 라이브러리에서이 문제를 해결할 수 Underscore.js '들 _.pick
.
var obj = {name: 'John', age: null};
var compacted = _.pick(obj, function(value) {
return value !== null && value !== undefined;
});
JSFiddle 예제를 참조하십시오.
감소 도우미가 유형 검사없이 트릭을 수행 할 수 있습니다.
const cleanObj = Object.entries(objToClean).reduce((acc, [key, value]) => {
if (value) {
acc[key] = value;
}
return acc;
}, {});
심층 검색을 위해 다음 코드를 사용 했는데이 질문을 보는 사람에게 유용 할 것입니다 (순환 종속성에는 사용할 수 없습니다).
function removeEmptyValues(obj) {
for (var propName in obj) {
if (!obj[propName] || obj[propName].length === 0) {
delete obj[propName];
} else if (typeof obj[propName] === 'object') {
removeEmptyValues(obj[propName]);
}
}
return obj;
}
누군가가 undefined
심층 검색을 사용하여 객체에서 값 을 제거 해야하는 경우 lodash
여기에 내가 사용하는 코드가 있습니다. 모든 빈 값 ( null
/ undefined
) 을 제거하도록 수정하는 것은 매우 간단합니다 .
function omitUndefinedDeep(obj) {
return _.reduce(obj, function(result, value, key) {
if (_.isObject(value)) {
result[key] = omitUndefinedDeep(value);
}
else if (!_.isUndefined(value)) {
result[key] = value;
}
return result;
}, {});
}
속성을 삭제하는 대신 null이 아닌 키를 사용하여 새 객체를 만들 수도 있습니다.
const removeEmpty = (obj) => {
return Object.keys(obj).filter(key => obj[key]).reduce(
(newObj, key) => {
newObj[key] = obj[key]
return newObj
}, {}
)
}
eslint를 사용하고 매개 변수 없음 재 지정 규칙이 트립되지 않도록하려면 Object.assign을 .reduce 및 계산 된 속성 이름과 함께 사용하여 매우 우아한 ES6 솔루션을 사용할 수 있습니다.
const queryParams = { a: 'a', b: 'b', c: 'c', d: undefined, e: null, f: '', g: 0 };
const cleanParams = Object.keys(queryParams)
.filter(key => queryParams[key] != null)
.reduce((acc, key) => Object.assign(acc, { [key]: queryParams[key] }), {});
// { a: 'a', b: 'b', c: 'c', f: '', g: 0 }
Here is a functional way to remove nulls
from an Object using ES6 without mutating the object using only reduce
:
const stripNulls = (obj) => {
return Object.keys(obj).reduce((acc, current) => {
if (obj[current] !== null) {
return { ...acc, [current]: obj[current] }
}
return acc
}, {})
}
You can also use ...
spread syntax using forEach
something like this:
let obj = { a: 1, b: "b", c: undefined, d: null };
let cleanObj = {};
Object.keys(obj).forEach(val => {
const newVal = obj[val];
cleanObj = newVal ? { ...cleanObj, [val]: newVal } : cleanObj;
});
console.info(cleanObj);
Clean object in place
// General cleanObj function
const cleanObj = (valsToRemoveArr, obj) => {
Object.keys(obj).forEach( (key) =>
if (valsToRemoveArr.includes(obj[key])){
delete obj[key]
}
})
}
cleanObj([undefined, null], obj)
Pure function
const getObjWithoutVals = (dontReturnValsArr, obj) => {
const cleanObj = {}
Object.entries(obj).forEach( ([key, val]) => {
if(!dontReturnValsArr.includes(val)){
cleanObj[key]= val
}
})
return cleanObj
}
//To get a new object without `null` or `undefined` run:
const nonEmptyObj = getObjWithoutVals([undefined, null], obj)
With Lodash:
_.omitBy({a: 1, b: null}, (v) => !v)
If you prefer the pure/functional approach
const stripUndef = obj =>
Object.keys(obj)
.reduce((p, c) => ({ ...p, ...(x[c] === undefined ? { } : { [c]: x[c] })}), {});
If you don't want to modify the original object (using some ES6 operators):
const keys = Object.keys(objectWithNulls).filter(key => objectWithNulls[key]);
const pairs = keys.map(key => ({ [key]: objectWithNulls[key] }));
const objectWithoutNulls = pairs.reduce((val, acc) => ({ ...val, ...acc }));
The filter(key => objectWithNulls[key])
returns anything that is truthy, so will reject any values such as0
or false
, as well as undefined
or null
. Can be easily changed to filter(key => objectWithNulls[key] !== undefined)
or something similar if this is unwanted behaviour.
You can do a recursive removal in one line using json.stringify's replacer argument
const removeNullValues = obj => (
JSON.parse(JSON.stringify(obj, (k,v) => v==null?undefined:v))
)
Usage:
removeNullValues({a:{x:1,y:null,z:undefined}}) // Returns {a:{x:1}}
비어 있고 정의되지 않은 빈 개체와 빈 배열을 반복적으로 제거하여 복사본을 반환합니다 (ES6 버전)
export function skipEmpties(dirty) {
let item;
if (Array.isArray(dirty)) {
item = dirty.map(x => skipEmpties(x)).filter(value => value !== undefined);
return item.length ? item : undefined;
} else if (dirty && typeof dirty === 'object') {
item = {};
Object.keys(dirty).forEach(key => {
const value = skipEmpties(dirty[key]);
if (value !== undefined) {
item[key] = value;
}
});
return Object.keys(item).length ? item : undefined;
} else {
return dirty === null ? undefined : dirty;
}
}
참고 URL : https://stackoverflow.com/questions/286141/remove-blank-attributes-from-an-object-in-javascript
'IT story' 카테고리의 다른 글
Swift에서 배열에서 요소를 제거하는 방법 (0) | 2020.05.09 |
---|---|
라 라벨 설치 : ~ / .composer / vendor / bin 디렉토리를 PATH에 배치하는 방법? (0) | 2020.05.09 |
PHP에서 함수 / 메소드 호출 이름을 얻는 방법은 무엇입니까? (0) | 2020.05.09 |
영숫자 텍스트에서 선행 0을 제거하는 방법? (0) | 2020.05.09 |
파이썬 : 설정할 목록을 추가 하시겠습니까? (0) | 2020.05.09 |