2016-03-20 3 views
0

複数の入れ子になったオブジェクトを含む配列をフィルタリングする必要があるAngular2でフィルタパイプを作成しようとしています。これらのオブジェクトは、Salesforceから来ていると、時々、次の例のようにネストされたオブジェクトが含まれます:彼らは複数のレベルに行く傾向がないので、入れ子オブジェクトの配列をフィルタリングする

Object { 
    Id: "a0436000001awB5AAI", 
    Name: "Some product", 
    Store__c: "a0436000001awC2JJU", 
    Product__c: "a0136000001UGzzAAG", 
    Product__r: Object { 
     Id: "a0136000001UGzzAAG", 
     Name: "Parent product", 
     ... 
    }, 
    ... 
} 

ノーマルソート方法は非常にうまく機能しません。私は自分自身を書くことを試みてきましたが、私はそれを理解していないようです。ここに私が今持っているものがあります:

// # Filter Array of Objects 
@Pipe({ name: 'filter' }) 
export class FilterArrayPipe implements PipeTransform { 

    transform(value, args) { 

     let filterKeys: string[]; 
     if (args[1]) { 
      let parts = args[1].replace(' ', '').split(','); 
      filterKeys = parts; 
     } 

     if (!args[0]) { 

      return value; 

     } else if (value) { 

      return value.filter(item => { 

       for (let key in item) { 

        if ((typeof item[key] === 'string' || item[key] instanceof String && item[key]) && (item[key].indexOf(args[0]) !== -1)) { 

         if (filterKeys && filterKeys.length > 0) { 

          if (item[key] in filterKeys) { 

           return true; 

          } 
         } 
         else { 

          return true; 

         } 
        } 

       } 
      }); 
     } 
    } 

} 

これはまったくうまくいきません。

+0

このパイプフィルタで何を達成したいですか? –

+0

あなたのコードは、あなたがこのようにフィルタリングしようとしていることを示唆しています: "* ngFor ="#i of someArray |フィルタ: 'a0136000001UGzzAAG': 'Id、Sotre__c' "。正しいですか?また、 'in'演算子を間違って使用しています。 'if(item [key] in filterKeys)'で、配列をオブジェクトとともに使用する必要があります。 – Abdulrahman

+0

@Abdulrahmanパイプを使用しようとしているところは、まさに正しいのですか? – watzon

答えて

1

あなたのコードを動作させるために必要なのはラインを変更することです:

if (item[key] in filterKeys) { 

「演算子で」プロパティがオブジェクトに存在するかどうかをチェックするために使用されています。

代わりに、あなたが使用してアレイ用:ここ

if (filterKeys.indexOf(key) > -1) { 

は、私はそれを考え出した作業plunker

0

です。完璧ではありませんが、仕事をします:

private flattenObject(ob) { 
     var toReturn = {}; 

     for (var i in ob) { 
      if (!ob.hasOwnProperty(i)) continue; 

      if ((typeof ob[i]) == 'object') { 
       var flatObject = this.flattenObject(ob[i]); 
       for (var x in flatObject) { 
        if (!flatObject.hasOwnProperty(x)) continue; 

        toReturn[i + '.' + x] = flatObject[x]; 
       } 
      } else { 
       toReturn[i] = ob[i]; 
      } 
     } 
     return toReturn; 
    }; 

    transform(value, args) { 

     let filterKeys: string[]; 
     if (args[1]) { 
      console.log(args[1]); 
      if (typeof args[1] === 'string') { 
       console.log('string'); 
       let parts = args[1].replace(' ', '').split(','); 
       filterKeys = parts; 
      } else if (typeof args[1] === 'object') { 
       console.log('object'); 
       filterKeys = args[1]; 
      } 
     } 


     if (!args[0]) { 
      return value; 
     } else if (value) { 

      let retArr: Object[] = []; 

      for (let obj of value) { 

       let filterable: Object = this.flattenObject(obj); 

        for (let key in filterable) { 

         key = String(key); 
         let val = String(filterable[key]); 

         if (val.indexOf(args[0]) !== -1) { 
          if (filterKeys && filterKeys.length > 0) { 
           if (filterKeys.indexOf(key) > -1) { 
            retArr.push(obj); 
           } 
          } 
          else { 
           return true; 
          } 
         } 

        } 

      } 

      return retArr; 

     } 
    } 

基本的にオブジェクトを平坦化してから、それをフィルタリングします。

関連する問題