次のようなJavascriptオブジェクトがあります。
var my_object = { a:undefined, b:2, c:4, d:undefined };
未定義のプロパティをすべて削除する方法誤った属性は残るべきです。
すべてのfalsey値を削除する場合、最も簡単な方法は次のとおりです。
_.pick(obj, _.identity);
例えば(Lodash 3.x):
_.pick({ a: null, b: 1, c: undefined }, _.identity);
>> Object {b: 1}
Lodash 4.xの場合:
_.pickBy({ a: null, b: 1, c: undefined }, _.identity);
>> Object {b: 1}
_.omit()
を_.isUndefined
と_.isNull
のコンポジションにチェインして、遅延評価で結果を得ることができます。
var result = _(my_object).omit(_.isUndefined).omit(_.isNull).value();
2016年3月14日に更新:
コメント欄の dylants で述べたように、 _.omitBy()
関数は、プロパティではなく述語を使用するためです。 lodashのバージョン4.0.0
以上でこれを使うべきです。
var result = _(my_object).omitBy(_.isUndefined).omitBy(_.isNull).value();
2016年6月1日更新:
Max Truxa でコメントされているように、lodashは既に代わりの_.isNil
を提供していました。
var result = _.omitBy(my_object, _.isNil);
lodashを使用している場合は、_.compact(array)
を使用して配列からすべての誤った値を削除できます。
_.compact([0, 1, false, 2, '', 3]);
// => [1, 2, 3]
ただ
_.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); }));
他の答えを完成させるには、lodash 4ではundefinedと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ではObject.keysのみを使用することもできます)。 v != null
がnullとundefinedの両方をチェックすることにも注意してください。
> 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 Object.keysのみのバージョンです:しかし、一般的にNode 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ができるのであれば、私はいかなるサードパーティ製のライブラリの依存関係も避けたいと思います。
私はオブジェクトからundefined
を削除することで同様の問題に遭遇しました、そして、あなたがあなたの普通の古いオブジェクトを変換してJSONを使用することに問題がなければ、速くて汚いヘルパー関数はこのように見えるでしょう:
function stripUndefined(obj) {
return JSON.parse(JSON.stringify(obj));
}
「...定義されていない場合、変換中に関数またはシンボルに遭遇するか、省略されるか(オブジェクト内に見つかった場合)、nullに打ち切られた場合(配列内に見つかった場合)のいずれかになります。」
undefined == null
を考慮して、次のように書くことができます。
let collection = {
a: undefined,
b: 2,
c: 4,
d: null,
}
console.log(_.omit(collection, it => it == null))
// -> { b: 2, c: 4 }
これが私がとろうとしているのだ。
_(my_object)
.pairs()
.reject(function(item) {
return _.isUndefined(item[1]) ||
_.isNull(item[1]);
})
.zipObject()
.value()
pairs() 関数は、入力オブジェクトをキー/値配列の配列に変換します。 undefined
とnull
の値を削除するために reject() を使用する方が簡単になるようにこれを行います。その後、却下されなかったペアが残ります。これらは zipObject() に入力され、オブジェクトが再構築されます。
深いネストしたオブジェクトの場合は、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
};
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];
}
});
"undefined"や "null"だけが拒否されるわけではないので、誤ったテストを使わないようにしてください。 "false"、 "0"、空文字列、{}などの他の誤った値です。したがって、単純にわかりやすくするために、上記のように明示的な比較を使用することにしました。
正しい答えは:
_.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
の値も削除します。
すべての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/[email protected]/lodash.min.js"></script>
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"
}