いくつかのプロパティを持つオブジェクトがあります。偽の値を持つプロパティを削除したいと思います。
これはcompact
onarrayで実現できますが、オブジェクトについてはどうでしょうか。
いくつかのプロパティを持つオブジェクトがあります。偽の値を持つプロパティを削除したいと思います。
これはcompact
onarrayで実現できますが、オブジェクトについてはどうでしょうか。
回答:
あなたはあなた自身のアンダースコアプラグイン(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;
}
});
_.compact
。真の値のみで浅いクローンを作成するのではなく、プロパティを削除します。以下のstackoverflow.com/a/19750822/465684を参照してください
delete
プロトタイプチェーンから同じ名前のプロパティがすぐに公開され、「非表示のクラス」(V8)が原因でパフォーマンスが低下するため、使用は一般的に推奨されていません。オブジェクト構造を変更すると、エンジンが余分な作業を行うことになります。最良かつ最短の解決策はです_.pick(o, _.identity)
。
アンダースコアバージョン1.7.0以降、次のものを使用できます_.pick
。
_.pick(sourceObj, _.identity)
2番目のパラメーターは、_.pick
値を選択するための述語関数にすることができます。述部が真を返す値が選択され、述部が偽を返す値は無視されます。
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
れましたが、ホワイトリストの代わりに述語関数を受け入れませんでした。
_.identity
機能について言及してくれてありがとう、とても便利です。
_.omit(sourceObj, _.isUndefined)
未定義の値(false、null、0を許可)のみを削除するために使用することもできます。
pick(obj, Boolean)
偽の値arr.filter(Boolean)
から配列をクリーンアップするときに同じアプローチを使用できる偽の値を排除することも可能です...–
_.pick(sourceObj, prop => prop)
_.pick
では、プロパティ名で動作します。使用後の説明にあるように、この機能については_.pickBy
_.omitBy( source, i => !i );
これは、エミルの答えとは逆の方法で述べられています。このようにして、imhoはより明確に読みます。それはもっと自明です。
ES6の贅沢がない場合は、少しきれいではありません。 _.omitBy( source, function(i){return !i;});
_.omitBy( source, _.isEmpty)
真実性の_.isEmpty
代わりに_.identity
を使用すると、コレクションから空の配列とオブジェクトが便利に削除され、おそらく不便なことに数値と日付が削除されます。したがって、結果はOPの質問に対する正確な答えではありませんが、空のコレクションを削除する場合に役立つ可能性があります。
omitBy
。の下にあります。lodash.com/docs#omitBy
_.pick(source, i => i);
否定を回避します
_.pickBy(source)
必要なのはそれだけです。
_.isEmpty(5) === true
。したがって、数値である値は削除されます。
lodashの変換で、
_.transform(obj, function(res, v, k) {
if (v) res[k] = v;
});
var compactObject = _.partialRight(_.pick, _.identity);
_.pickBy(object)
必要なのはそれだけです
Object.keys(o).forEach(function(k) {
if (!o[k]) {
delete o[k];
}
});
.keys
とにアンダースコアを使用できます.forEach
。
forEach
JSの方法のリンクを教えてください
オブジェクトの場合は削除します。
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を持つキーと値のペアが削除されます。
けれどもは、_.compact
配列で使用するために文書化されています。オブジェクトに対しても機能するようです。Chrome、Opera、Firefoxコンソールで以下を実行しました。
var obj = {first: 1, second: null, third: 3, fourth: function(){return 5}}
undefined
_.compact(obj)
[1, 3, function()]
更新:サンプルが示すよう_.compact
に、オブジェクトを呼び出すとキーが削除され、圧縮された配列が返されます。