2017-02-10 15 views
0

I以下のJSONファイルがあります。つまりパイプを修正して重複したエントリを削除するにはどうすればよいですか?

models[x].years[y].styles[z].submodel.body 

http://pastebin.com/1TguvZXc

重複の体は、 "配列を横断して配列で見つけることができ

models[0].years[0].styles[0].submodel.body 

をすべき重複を確認する:

models[0].years[0].styles[1].submodel.body 
models[0].years[0].styles[2].submodel.body 
models[0].years[0].styles[n].submodel.body 

残りのデータは私には役に立たない。

I持って、次のパイプ:

import { Pipe, PipeTransform } from '@angular/core'; 
@Pipe({ 
    name: 'filterByCategory' 
}) 
export class FilterByCategoryPipe implements PipeTransform { 

    transform(input: any , search: string): any[] { 
    if (input === undefined || input.length === 0) { 
     return input; 
    } 

    const filteredArr: Array<any> = JSON.parse(JSON.stringify(input)); 

    for (const model of filteredArr) { 
     for (const year of model.years) { 
     year.styles = year.styles.filter(style => { 
      return style.submodel.body === search; 
     }); 
     } 
     } 


    return filteredArr; 
    } 

} 

がどのように私は私の.filter機能に追加された「テスト」を追加します「submodel.body」の値は、スタイル配列のいずれかに存在するかどうかをチェックしますか?

+1

あなたは '' Array' indexOf'または 'includes'方法を利用することができます。 'includes'のブラウザ互換性を確認してください。 – Agalo

+0

JavaScriptの新機能です。' year.styles = year.styles.filter(style => { returnの結果をフィルタリングするために、このメソッドをどこに置くかを詳しく説明できます。 style.submodel.body === search; }); '? – Moshe

+1

私は、 'styles'を格納するための新しい配列を作成し、作成された配列の中にスタイルの存在を確認することをお勧めします。 – Agalo

答えて

2

基本的には、filter関数を使用して重複要素を削除する必要があります。

ので、重複は以下のようになります削除して、次の

function removeDuplicate(element, index, array) { 
       return array.map(style => style.submodel.body).indexOf(element.submodel.body) === index; 
      } 

indexOf機能を使用する関数は、コードのJSのバージョンを働いている、あなたはそれを利用し、のための場所の条件を追加することができますあなたの投稿に定義されているようにを検索してください。

function removeDuplicate(element, index, array) { 
 
      return array.map(style => style.submodel.body).indexOf(element.submodel.body) === index; 
 
     } 
 

 
var data = '{"models":[{"id":"Acura_ILX","name":"ILX","niceName":"ilx","years":[{"id":401640361,"year":2017,"styles":[{"id":401640368,"name":"AcuraWatch Plus Package 4dr Sedan (2.4L 4cyl 8AM)","submodel":{"body":"Sedan","modelName":"ILX Sedan","niceName":"sedan"},"trim":"AcuraWatch Plus Package"},{"id":401640367,"name":"Technology Plus and A-SPEC Packages 4dr Sedan (2.4L 4cyl 8AM)","submodel":{"body":"Sedan","modelName":"ILX Sedan","niceName":"sedan"},"trim":"Technology Plus and A-SPEC Packages"},{"id":401640366,"name":"Premium Package 4dr Sedan (2.4L 4cyl 8AM)","submodel":{"body":"Sedan","modelName":"ILX Sedan","niceName":"sedan"},"trim":"Premium Package"},{"id":401640365,"name":"Premium and A-SPEC Packages 4dr Sedan (2.4L 4cyl 8AM)","submodel":{"body":"Sedan","modelName":"ILX Sedan","niceName":"sedan"},"trim":"Premium and A-SPEC Packages"},{"id":401640364,"name":"Technology Plus Package 4dr Sedan (2.4L 4cyl 8AM)","submodel":{"body":"Sedan","modelName":"ILX Sedan","niceName":"sedan"},"trim":"Technology Plus Package"},{"id":401640363,"name":"4dr Sedan (2.4L 4cyl 8AM)","submodel":{"body":"Sedan","modelName":"ILX Sedan","niceName":"sedan"},"trim":"Base"}]}]},{"id":"Acura_NSX","name":"NSX","niceName":"nsx","years":[{"id":200779937,"year":2017,"styles":[{"id":101418796,"name":"2dr Coupe AWD (3.5L 6cyl Turbo gas/electric hybrid 9AM)","submodel":{"body":"Coupe","modelName":"NSX Coupe","niceName":"coupe"},"trim":"Base"}]}]}],"modelsCount":6}'; 
 

 

 
var jsonData = JSON.parse(data); 
 
jsonData.models.forEach(model => 
 
         model.years.forEach(year => 
 
\t \t \t year.styles = year.styles.filter(removeDuplicate) 
 
\t \t \t)); 
 
console.log(jsonData);

+0

私が探していたもの!どんなトラブルでも対応して対応します。ありがとう! @Agalo – Moshe

+0

それは動作していますか? – Agalo

+0

はいそれは動作します:) – Moshe

関連する問題