2016-10-14 11 views
0

とコレクション内のすべてのオブジェクトは、私はオブジェクトと配列を持っていて下さい。短く少なくとも一つの整合性

Array =[ 
    {id = 1, products='1,2'} //products consist of String with Products Seperates by',' 
    {id = 2, products='1'} 
    {id = 3, products='3'} 
    {id = 4, products='1,2,3'} 
    {id = 5, products='2,3'} 
    ... 
    ] 
SelectedProd = ['2,3']// consists a String as well seperated by ',' 

これはすべて表に表示されます。今すぐMultipleSelectで選択されたものだけを表示するフィルターを書きます。
そこで私は、ユーザーはそれがid=1/3/4/5..てくれたオブジェクトを返すProduct = '2,3'選択した場合、少なくとも1つの製品がproducts
にだから私のフィルターは、オブジェクトと選択した製品

.filter('filterByProd',() => { 
      return (objects,prod) => { 
      var filtered = []; 
      /* 
FIlter Array 
*/ 
      return filtered; 
      }; 
     }); 

を取得しているされたすべてのオブジェクトをフィルタしたいです
明らかに何も選択されていない場合はすべてを返します。 可能な場合はlodashを使用してください。
私が持っている問題は、機能だけでlodashドキュに記載されていますし、カントは私が必要とするすべての人に読んであります。のみ>Object = id=5 - 瞬間はIAMで
これは'2,3'と完全一致のみを私を与えている

.filter('filterByProd',() => { 
    return (items,prod) => { 
    var filtered = []; 
    filtered = _.filter(items,['products',prod]); 
    return filtered; 
    }; 
}); 

で立ち往生。
あなたは配列形式でCSVのを含む新しい配列プロパティを注入または配列と完全に製品を交換することにより、いずれか、それを修正し、サーバーからこのオブジェクトを取得したら、私は何か

filtered = findAllWhere(selectedProducts,iterateOverSendObjects(checkProductsOfObjects)+_.ifIsAtLeastOneOfSendProducts)) 
+0

非空であるオブジェクトのみをフィルタリングするためにフィルタを使用します'[2,3]'?そして、それを繰り返すのは簡単なことでしょう – taguenizy

+0

私のサーバーからこのようになっています。 – AkAk47

+0

いずれにしても、解析する必要があります。データを取得したとき、またはフィルタリングしようとするとすぐにそれを行うことができます – taguenizy

答えて

1

あなたが希望する結果を得るためにlodashの交差方法を使用することができます。それが存在している、または他の[]を返す場合に2つの配列の

Lodash _.intersection戻り交差点:

var arr = [ 
 
    {id : 1, products:'1,2'}, 
 
    {id : 2, products:'1'}, 
 
    {id: 3, products:'3'}, 
 
    {id : 4, products:'1,2,3'}, 
 
    {id : 5, products:'2,3'}]; 
 

 
var SelectedProd = ['2,3']; 
 

 
var a = arr.filter(x => { 
 
    return _.intersection(
 
      x.products.split(','), SelectedProd[0].split(',')).length>0; 
 
}); 
 

 
console.log(a);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.16.4/lodash.js"></script>

説明:ここでは

var a = arr.filter(x => { 
    return _.intersection(
      x.products.split(','), SelectedProd[0].split(',') 
      ).length > 0; 

は作業インラインフィドルです。私たちは、あなたが `のような製品のための文字列を持っていないのはなぜ2,3'`それが持つ配列を持っているあなたの問題でより多くの意味をなすだろうというときの交点が

+0

あなたの解決策を実行中です。何も選択されていなければもう1つの質問がありますvar a = arr.filter(....)のようなものがありますif(selected === null)return arr; 現時点では、フィルタリングする前にそれをSimpleとチェックしています。私はそれに何かを付けることができるかどうかだけ知りたいですか? :) – AkAk47

0

を必要としています。最終的な配列が結合する前に、次のようなものでなければなりません:答えとしてマークしてください

[
{id = 1, products=[1,2]}, {id = 2, products=[1]} ... ]

これはあなたが選択した項目で検索するArray.prototype.some()Array.prototype.filter()String.prototype.includes()を使用してアイテムをフィルタリングすることができ

+0

解決策はありませんか?私はこのフィルタだけよりも多くの関数で使用しているからです。そして、それでも解決策ではありません。どのようにオブジェクトをフィルタリングするのですか? – AkAk47

+0

すべてのサーバーレスポンスオブジェクトが似ている場合、レスポンスオブジェクトの変換を処理する簡単なMapperモジュールを簡単に作成できます。フィルタリングに関するあなたの質問に関して:あなたができることはforeachループ内でindexOf JS操作を使用して、オブジェクトの配列を反復処理することです。 indexOfオペレーションが選択した各製品に対して-1以外の値を返す場合は、最終結果セットに追加できます。これはトリックを行う必要があります。 –

+0

いいえ、ほとんどすべて異なっています。これは、そうであるように必要とされているので、これが来ている。しかし、あなたが修正する方法を説明するなら、私はそれをフィルターでのみ行うことができます。そしてそこにはフィルタリングがあります – AkAk47

0

を助けている場合文字列:

const findIemsByProducts = (items, selectedProd) => { 
 
    const selected = selectedProd[0].split(','); // convert the selected products to array 
 
    
 
    return items.filter((item) => // filter the items 
 
    selected.some((productId) => // if at least one of the selected 
 
     item.products.includes(productId) // is in the products string 
 
    )); 
 
} 
 

 
var items = [ 
 
    {id: 1, products: '1,2'}, 
 
    {id: 2, products: '1'}, 
 
    {id: 3, products: '3'}, 
 
    {id: 4, products: '1,2,3'}, 
 
    {id: 5, products: '2,3'} 
 
]; 
 

 
var SelectedProd = ['2,3']; 
 

 
var results = findIemsByProducts(items, SelectedProd); 
 

 
console.log(results);

そして、角度フィルタのようになります。

.filter('filterByProd',() => (items, selectedProd) => { 
    const selected = selectedProd[0].split(','); // convert the selected products to array 

    return items.filter((item) => // filter the items 
    selected.some((productId) => // if at least one of the selected 
     item.products.includes(productId) // is in the products string 
    )); 
}); 
関連する問題