オブジェクトから未定義のフィールドを削除するクリーンな方法はありますか?
つまり.
> var obj = { a: 1, b: undefined, c: 3 }
> removeUndefined(obj)
{ a: 1, c: 3 }
私は2つのソリューションに出会いました:
_.each(query, function removeUndefined(value, key) {
if (_.isUndefined(value)) {
delete query[key];
}
});
または:
_.omit(obj, _.filter(_.keys(obj), function(key) { return _.isUndefined(obj[key]) }))
ES6矢印関数と三項演算子を使用した1行のライナー:
Object.keys(obj).forEach(key => obj[key] === undefined ? delete obj[key] : '');
または、3進数の代わりにshort-circuit評価を使用します:(@Matt Langlois、情報をありがとう!)
Object.keys(obj).forEach(key => obj[key] === undefined && delete obj[key])
If式を使用した同じ例:
Object.keys(obj).forEach(key => {
if (obj[key] === undefined) {
delete obj[key];
}
});
null
、''
、およびundefined
を削除する場合は、!obj[key]
の代わりにobj[key] === undefined
を使用します。
ネストされたオブジェクトからもアイテムを削除する場合は、recursive関数を使用できます。
const removeEmpty = (obj) => {
Object.keys(obj).forEach(key => {
if (obj[key] && typeof obj[key] === 'object') removeEmpty(obj[key]);
else if (obj[key] === undefined) delete obj[key];
});
return obj;
};
_var obj = { a: 1, b: undefined, c: 3 }
_
オブジェクトのundefined
小道具を削除するには、次のように使用します
JSON.parse(JSON.stringify(obj));
出力: _{a: 1, c: 3}
_
Lodashのようなものを使用することを好みます。
import { pickBy, identity } from 'lodash'
const cleanedObject = pickBy(originalObject, identity)
アイデンティティ関数はただx => x
とその結果は、すべての偽の値に対してfalseになります。したがって、これは未定義の「」、0、null、...を削除します.
undefined
値のみを削除する場合は、次の操作を実行できます。
const cleanedObject = pickBy(originalObject, v => v !== undefined)
それはあなたに新しいオブジェクトを与えます。これは通常、他の答えのいくつかが示唆するように、元のオブジェクトを変更するよりも望ましいです。
また、このソリューションでは、 Object.keys が特定のオブジェクトの列挙可能なプロパティの配列を返すため、hasOwnProperty()
も回避されます。
Object.keys(obj).forEach(function (key) {
if(typeof obj[key] === 'undefined'){
delete obj[key];
}
});
これをnull
または''
として追加して、より厳密なクリーニングを行うことができます。
それは言及されていないようですので、ここに私の好みの方法、sans副作用または外部依存関係があります:
const obj = {
a: 1,
b: undefined
}
const newObject = Object.keys(obj).reduce((acc, key) => {
const _acc = acc;
if (obj[key] !== undefined) _acc[key] = obj[key];
return _acc;
}, {})
console.log(newObject)
// Object {a: 1}
これは覚えやすいですが、遅いかもしれません。 jQueryを使用して、null以外のプロパティを空のオブジェクトにコピーします。 true
を最初の引数として追加しない限り、ディープコピーはありません。
myObj = $.extend({}, myObj);
プレーンなJavaScript(ライブラリは不要)のソリューションは次のとおりです。
function removeUndefinedProps(obj) {
for (var prop in obj) {
if (obj.hasOwnProperty(prop) && obj[prop] === undefined) {
delete obj[prop];
}
}
}
Mhh .. @Damianはremove undefined field (property) from an JS object
を要求すると思います。その後、私は単にやるだろう:
for (const i in myObj)
if (typeof myObj[i] === 'undefined')
delete myObj[i];
(Vanilla)JSの短くて効率的なソリューション!例:
const myObj = {
a: 1,
b: undefined,
c: null,
d: 'hello world'
};
for (const i in myObj)
if (typeof myObj[i] === 'undefined')
delete myObj[i];
console.log(myObj);
別のJavascriptソリューション
for(var i=0,keys = Object.keys(obj),len=keys.length;i<len;i++){
if(typeof obj[keys[i]] === 'undefined'){
delete obj[keys[i]];
}
}
Object.keys
はプロトタイプチェーンを検索せず、hasOwnProperty
のプロパティのみを返すため、追加のobj
チェックは不要です。