いくつかのプロパティを持つオブジェクトがあります。偽の値を持つプロパティを削除したいと思います。
これはcompact
onarrayで実現できますが、オブジェクトについてはどうでしょうか。
いくつかのプロパティを持つオブジェクトがあります。偽の値を持つプロパティを削除したいと思います。
これはcompact
onarrayで実現できますが、オブジェクトについてはどうでしょうか。
アンダースコアバージョン1.7.0以降、次を使用できます_.pick
。
_.pick(sourceObj, _.identity)
2番目のパラメーター_.pick
は、値を選択するための述語関数にすることができます。述部がtrueを返す値が選択され、述部がfalseを返す値は無視されます。
pick _.pick(object、* keys)
ホワイトリストに登録されたキー(または有効なキーの配列)の値のみを持つようにフィルター処理された、オブジェクトのコピーを返します。または、選択するキーを示す述語を受け入れます。
_.identity
は、最初の引数を返すヘルパー関数です。つまり、真の値を選択し、偽の値を拒否する述語関数としても機能します。アンダースコアライブラリには、他にも多数の述語が付属しています。たとえば、_.pick(sourceObj, _.isBoolean)
ブール値のプロパティのみが保持されます。
この手法を頻繁に使用する場合は、もう少し表現力を高めたいと思うかもしれません。
var pickNonfalsy = _.partial(_.pick, _, _.identity); // Place this in a library module or something
pickNonfalsy(sourceObj);
アンダースコアバージョン1.6.0_.pick
も提供されていますが、ホワイトリストの代わりに述語関数を受け入れませんでした。
あなたはあなた自身のアンダースコアプラグイン(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;
}
});
_.omitBy( source, i => !i );
これは、エミルの答えとは逆の方法で述べられています。このようにして、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];
}
}
突然、再帰的に偽りを取り除く関数を作成する必要がありました。これがお役に立てば幸いです。Lodashを使用しています。
var removeFalsies = function (obj) {
return _.transform(obj, function (o, v, k) {
if (v && typeof v === 'object') {
o[k] = _.removeFalsies(v);
} else if (v) {
o[k] = v;
}
});
};
_.mixin({ 'removeFalsies': removeFalsies });
次に、それを使用できます。
var o = _.removeFalsies({
foo: 'bar',
a: 0,
b: false,
c: '',
d: null,
e: undefined,
obj: {
foo: 'bar',
a: 0,
b: false,
c: '',
d: null,
e: undefined
}
});
// {
// foo: 'bar',
// obj: {
// foo: 'bar'
// }
// }
gion_13の答えに追加するには:
_.mixin({
compactObject : function(o) {
var newObject = {};
_.each(o, function(v, k) {
if(v !== null && v !== undefined) {
newObject[k] = v
}
});
return newObject;
}
});
これは、すべてを複製してキーと値のペアを削除する代わりに、新しいオブジェクトを作成し、キーと値を追加します。マイナーな違い。
しかし、もっと重要なことは、falseの代わりにnullとundefinedを明示的にチェックすることです。これにより、値としてfalseを持つキーと値のペアが削除されます。
pickBy
lodashから使用する必要があります。
pickByのデフォルトの署名は_.(sourceObj, [_.identity])
、空のプロパティを削除するためです。
_.pickBy(sourceObj);
lodashであなたはこれが好きです:
_.pickBy(object, _.identity);
_.compact
アレイで使用するために文書化されていますが。オブジェクトに対しても機能するようです。Chrome、Opera、Firefoxのコンソールで次のコマンドを実行しました。
var obj = {first: 1, second: null, third: 3, fourth: function(){return 5}}
undefined
_.compact(obj)
[1, 3, function()]
更新:サンプルが示すよう_.compact
に、オブジェクトを呼び出すとキーが削除され、圧縮された配列が返されます。