いくつかのプロパティを持つオブジェクトがあります。偽の値を持つプロパティを削除したいと思います。
これは、配列で 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
});
@ AndreiNecula指摘 のように、このミックスインは元のオブジェクトに影響し、元のcompact
アンダースコアメソッド 配列のコピーを返します 。
この問題を解決し、compactObject
をcousinのように動作させるために、ここにマイナーアップデートを示します。
_.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
の2番目のパラメーターは、値を選択するための述語関数にすることができます。述語が返す値truthyが選択され、述語が返す値falsyは無視されます。
pick_.pick(object、* keys)
objectのコピーを返し、ホワイトリストに登録されたkeys(または有効なキーの配列)。または、選択するキーを示す述語を受け入れます。
_.identity
は、最初の引数を返すヘルパー関数です。つまり、真実の値を選択し、偽の値を拒否する述語関数としても機能します。 Underscoreライブラリには、他の多くの述語も付属しています。たとえば、_.pick(sourceObj, _.isBoolean)
はブール型プロパティのみを保持します。
この手法を頻繁に使用する場合は、もう少し表現力を豊かにすることをお勧めします。
var pickNonfalsy = _.partial(_.pick, _, _.identity); // Place this in a library module or something
pickNonfalsy(sourceObj);
アンダースコアバージョン1.6.0は_.pick
も提供していましたが、ホワイトリストの代わりに述語関数を受け入れませんでした。
_.omit( source, i => !i );
これは、エミルの答えと逆の形で述べられています。このようにして、私見はより明確になります。より自明です。
ES6の豪華さがない場合は、クリーン度がやや劣ります:_.omit( source, function(i){return !i;});
_.omit( source, _.isEmpty)
_.isEmpty
を使用して、真実性のために_.identity
の代わりにまた、空の配列とオブジェクトをコレクションから便利に削除し、おそらく不便な数字と日付を削除します。したがって、結果はOPの質問に対する正確な答えではありませんが、空のコレクションを削除する場合に役立ちます。
Lodashの transform を使用すると、
_.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;
}
});
これは、すべてを複製してキーと値のペアを削除する代わりに、新しいオブジェクトを作成し、キーと値を追加します。わずかな違い。
しかしより重要なことは、falseyの代わりにnullとundefinedを明示的にチェックすることです。これにより、値としてfalseを持つキーと値のペアが削除されます。
lodashでは、次のようにします。
_.pickBy(object, _.identity);