2016-05-24 22 views
0

カテゴリを表す配列のグループがあります。各配列はカテゴリであり、配列の各項目はサブジェクトです。より複雑な配列:配列のアイテムの比較とカウント

4 Categories containing Subjects 
['A','B','D'] 
['C'] 
['E','F'] 
['G','H','I','J'] 

私は別のアレイグループを持っています。これらのアイテムのそれぞれには、最大4つの可能なサブジェクトがあります。

3 Items containing Subjects 
['A','F'] 
['E','I','C'] 
['E','F','G'] 

各カテゴリの項目数をカウントしたいと思います。この場合、結果は次のようになります。

Total Items: 3 
Category 1: 1 
Category 2: 1 
Category 3: 3 
Category 4: 2 

3つの項目があり、そのうちのいくつかは複数のカテゴリに分類されています。私のアイテムの中には、1つのカテゴリに2つのサブジェクトがあり、それが私が犯しているところです。私の結果は、以下のとおりです。

Total Items: 3 
Category 1: 1 
Category 2: 1 
Category 3: 4 
Category 4: 2 

私の3番目の項目は、同じカテゴリ、Eで2つの科目を持っており、私が試した何F.

ので、カテゴリ3のための私のカウントが1でオフになって

categories = [ 
    { name: string, subjects: string[], count: number } 
] 

アイテムが幾分類似している:

参考

は、カテゴリは、オブジェクトの配列であります

items = [ 
    { subjects: Subject[] } 
] 

と被写体だけです:

{ id: string, name: string } 

これは私が微調整するために必要なものです:

categories.map(category => 
    category.subjects.map(categorySubject => { 
    if(items.subjects.map(itemSubject => itemSubject.id) 
     .some(val => itemSubject.indexOf(val) === 0)) { 
     category.count++; 
    } 
    })); 

私は私がいくつかと、右方向に向かっていたと思ったが、私が見つける必要がありますカテゴリ内に複数の科目がある項目を2回カウントしないで、項目科目がカテゴリにあるかどうかを確認する方法です。私はそれが私のアプローチであることを知っています。アイテムのフォーマット方法を変更することはできません(はい、本当に文字列です)が、より良い方法があればカテゴリを変更できます。

答えて

0

あなたの質問に答えるために、これが動作しているようです:

var categories: Array<{ name: string, subjects: Subject[], count: number }> = []; 

type Subject = { id: string, name: string } 

var items: Array<{ subjects: Subject[] }> = []; 

function inItem(subject: Subject, item: { subjects: Subject[] }): boolean { 
    return item.subjects.some(itemSubject => itemSubject.id === subject.id); 
} 

categories.forEach((category, index) => { 
    let count = 0; 

    for (let j = 0; j < items.length; j++) { 
     for (let i = 0; i < category.subjects.length; i++) { 
      if (inItem(category.subjects[i], items[j])) { 
       count++; 
       break; 
      } 
     } 
    } 

    console.log(`Category ${ index + 1 }: ${ count }`); 
}); 

code with the data in playground

しかし、あなたは誰いないのであれば、それは理解することは非常に簡単ではありません、これは本当に良い解決策ではありませんコードを書いたか、今から2ヶ月後にあなたが書いています。
インデックスを作成するなど、より良い解決策を思いつくべきでしょう。

すべてのカテゴリ/サブジェクトを保持するCategoriesIndexを持っているだけで、追加/削除/変更することができます。それには同じ配列を持つことができますが、項目からカテゴリへの参照もできます。

0

これは私が思いついたものですが、誰もこれを見てすぐに何が起こっているのか理解できません。

categories.map(category => category.count = 0); 
let nextCategory = false; 
let itemSubjects = items.map(item => item.subjects) 
    .map(subjects => subjects.map(subject => subject.id)); 
for(var i = 0; i < items.length; i++){ 
    for(var j = 0; j < categories.length; j++){ 
    nextCategory = false; 
    for(var k = 0; k < categories[j].subjects.length; k++){ 
     for(var l = 0; l < itemSubjects[i].length; l++){ 
     if(itemSubjects[i][l] === categories[j].subjects[k]){ 
      categories[j].count++; 
      nextCategory = true; 
      break; 
     } 
     } 
     if(nextCategory === true){ 
     break; 
     } 
    } 
    } 
}