2017-08-23 3 views
0

プロパティを含む場合と含まない場合のオブジェクトの配列があります。だから、未定義の可能性のあるプロパティを持つ配列フィルタ

、それをフィルタリングするために、私はこれを実行します。

array = array.filter(v => v.myproperty != undefined); 
array = array.filter(v => v.myproperty[0] != undefined); 

これは事実mypropertyが、その後、myproperty内の最初の要素のもの未定義で、ものを削除します。

filterをアレイに2回適用するのを防ぐ単一のライナーがある方法はありますか?

ような何か:最後に

array = array.filter((v => v.myproperty || [])[0] != undefined); 
+5

なりません'配列= array.filter(!!V => v.myproperty =未定義&& v.myproperty [0] =未定義):1つだけのカッコを置き忘れ? – Blorgbeard

+0

いいえ、それはエラーです:定義されていないもののインデックス0にアクセスしようとしているので、 "mypropertyは定義されていません" – chiapa

+3

しかし、 '&&'短絡、そうですか? 'myproperty'が未定義の場合、' myproperty [0] 'は評価されません。 – Blorgbeard

答えて

2

何について:

filtered_array = array.filter(element => element.property && element.property[0]); 

何の条件がやっていることはまず左の部分を評価することです。それが本当であれば、正しい部分を評価して結果を返します。

Fiddle here

2

array.filter()はブール結果を期待して匿名関数を取ります。配列項目をフィルタリングする必要があるかどうかを判断するには、内部で任意の量の作業を行うことができます。

var array = [1, 2, undefined, 3, "some text", [5,6,7],[], [undefined,8]] 
 

 
array = array.filter(v => { 
 

 
    if (!v) return false; 
 

 
    if (v === "some text") return false; 
 
    
 
    if (Array.isArray(v) && v.length === 0) return false; 
 
    
 
    if (Array.isArray(v) && v[0] === undefined) return false; 
 

 
    return true; 
 

 
}); 
 

 

 
console.log(array);

1

文に複雑なブール論理を使用できます。

let array = [{num: [1]}, {num: [2]}, {num: [3]}, {num: undefined}, {}] 
array = array.filter(v => v && v.num && v.num.length) 

可読性とテスト容易性のために、別の場所でテストできる機能に分解したい場合があります。

function predicate(v) { 
    return v && v.num && v.num.length 
} 
let array = [{num: [1]}, {num: [2]}, {num: [3]}, {num: undefined}, {}] 
array = array.filter(predicate) 
1

また、プロパティ要素が配列であるかどうかを確認する必要があります。 element.property[0]でのみプロパティをチェックすることは、文字列にも当てはまります。それ以外にも、if文の場合と同様に、フィルタ内でbooleanを返すものを渡すことができます。

2

他の人が既にここで示唆していることを行うことができます。最初の条件が失敗した場合、関数が戻ります。

array => array.filter(v => v.ggwp && v.ggwp[0]) 

また、このような同じことを達成するためにオペレータに使用することができます。

array => array.filter(v => ('myproperty' in v) && (0 in v.myproperty)) 

はここであなたにこれらの二つの機能を比較するいくつかのテストケースとjsbinです。

!==の代わりに!=をコードに使用したいとは思っていません。 Javascript、型強制のためにweird behaviourがあります。

2

Something like array.filter((v => v.myproperty || [])[0] != undefined);

はい、まさにそのようなものです。`仕事;

array.filter(v => (v.myproperty || [])[0] != undefined); 
//   ^ ^
関連する問題