2017-07-13 31 views
0

私が取り組んでいる角度コードがあります。目標は、リファクタリングが間もなく行われるため、できるだけ角度1.xの機能性を少しでも使用することです。javascript配列とオブジェクトの配列を比較する

は、私は別の配列を収容するキーと値の関係を持つオブジェクトの配列に配列

let subscription = [ 
    "Cinemax Subscription", 
    "Disney Subscription", 
    "Encore Subscription", 
    "Epix Subscription", 
    "HBO Subscription", 
    "MLB Subscription", 
    "NBA Subscription", 
    "NHL Subscription", 
    "Division" 
] 

を比較しています。

let profiles = [ 
    { 
     name:"1+ Adults in Household", 
     qualifiers: [ 
      { 
       name: 'Number of adults in the household' 
      } 
     ] 
    }, 
    { 
     name: '75k', 
     qualifers: [ 
      { 
       name: 'Division' 
      }, 
      { 
       name: 'Income' 
      } 
     ] 
    }, 
    { 
     name: 'Time Warner', 
     qualifers: [ 
      { 
       name: 'Division' 
      } 
     ] 
    } 
] 

私はインデックスとこれをループするのが困難です。

let = profilesFiltered = []; 

は当初、私は、配列を比較するフィルタを使用しようと各 angular.for。

let filteredProfiles = subscription.filter(function (src) { 
    angular.forEach(profiles, function (key, index) { 
     if(src === key.qualifiers[index].name) { 
      profilesFiltered.push(key); 
     } 
    }) 
}); 

私は

key.qualifiers[index].name // 'Number of adults in the household' 

が、私は失敗し始めている方法を見て

subscription[0] // however, it will continue to 1 on the first object which isn't there. 

と比較して、正しいアウト開始していること、if文の内側に見ています。しかし、** profiles **配列の修飾子を正しくループさせる方法がわかりません。

希望の結果は、インデックス内の最後の配列項目であるの部門です。

profilesFiltered = [ 
    { 
    name: '75k', 
    qualifers: [ 
     { 
     name: 'Division' 
     }, 
     { 
     name: 'Income' 
     } 
    ] 
    }, 
    { 
     name: 'Time Warner', 
     qualifers: [ 
      { 
       name: 'Division' 
      } 
     ] 
    } 
] 

ご意見は、この時点で非常に高く評価されています。

おかげ

+0

あなたの問題は、依然として、少なくとも私にとっては、非常に不明瞭です。あなたのコードには多くの間違いがあります。たとえば、フィルタ関数でブール値を返さない。したがって、filteredProfilesは常に空になります。あなたは 'qualifiers'配列を実行していません - 最初のbtwの後のオブジェクトで間違ったスペルがあります - あなたは最初の修飾子だけを探しています。等。あなたは達成しようとしていることを自分自身が説明している小さな例を提供することができます。 –

答えて

2

だけfilter()some()の組み合わせを使用して、プロファイルのフィルタ:

profiles.filter(v => v.qualifiers.some(q => subscription.includes(q.name))); 

let subscription = [ 
 
    "Cinemax Subscription", 
 
    "Disney Subscription", 
 
    "Encore Subscription", 
 
    "Epix Subscription", 
 
    "HBO Subscription", 
 
    "MLB Subscription", 
 
    "NBA Subscription", 
 
    "NHL Subscription", 
 
    "Division" 
 
] 
 

 
let profiles = [{ 
 
    name: "1+ Adults in Household", 
 
    qualifiers: [{ 
 
     name: 'Number of adults in the household' 
 
    }] 
 
    }, 
 
    { 
 
    name: '75k', 
 
    qualifiers: [{ 
 
     name: 'Division' 
 
     }, 
 
     { 
 
     name: 'Income' 
 
     } 
 
    ] 
 
    }, 
 
    { 
 
    name: 'Time Warner', 
 
    qualifiers: [{ 
 
     name: 'Division' 
 
    }] 
 
    } 
 
] 
 

 
let res = profiles.filter(v => v.qualifiers.some(q => subscription.includes(q.name))); 
 

 

 
console.log(res)

1

あなたはこのような何かを探している、私のコード

をチェックアウト ここでは10

let profiles = [ 
 
    { 
 
     name:"1+ Adults in Household", 
 
     qualifiers: [ 
 
      { 
 
       name: 'Number of adults in the household' 
 
      } 
 
     ] 
 
    }, 
 
    { 
 
     name: '75k', 
 
     qualifiers: [ 
 
     { 
 
      name: 'Division' 
 
     }, 
 
     { 
 
      name: 'Income' 
 
     } 
 
     ] 
 
    }, 
 
    { 
 
     name: 'Time Warner', 
 
     qualifiers: [ 
 
      { 
 
       name: 'Division' 
 
      } 
 
     ] 
 
    } 
 
]; 
 

 
let subscription = [ 
 
    "Cinemax Subscription", 
 
    "Disney Subscription", 
 
    "Encore Subscription", 
 
    "Epix Subscription", 
 
    "HBO Subscription", 
 
    "MLB Subscription", 
 
    "NBA Subscription", 
 
    "NHL Subscription", 
 
    "Division" 
 
]; 
 

 
let profilesFiltered = profiles.filter(function (a) { 
 
    // first filter all element in the profiles array 
 
    // check if their qualifiers array is not empty 
 
    return a.qualifiers.some(function (b) { 
 
    // filter the qualifiers array by checking the property name 
 
    // is it muching any element from subscription array 
 
    return subscription.indexOf(b.name)!==-1; 
 
    }); 
 
}); 
 

 
console.log(profilesFiltered);

+0

かなりそうです。ありがとう! – Winnemucca

+2

'a.qualifiers.filter ...'で 'filter'を使うのは良い考えではありません。 'some'が最初の一致で反復処理を停止する間、filterは常に配列全体を反復処理します。それは不必要な作業です。 – baao

+0

あなたは大丈夫です;) –

-1

あなたのデータ構造のための作業コードです。これは、reduce機能を使用しています。重複がない場合は、answer here

https://jsbin.com/dexagiresa/2/edit?js,output

let profiles = [ 
{ 
    name:"1+ Adults in Household", 
    qualifiers: [ 
     { 
      name: 'Number of adults in the household' 
     } 
    ] 
}, 
{ 
    name: '75k', 
    qualifiers: [ 
     { 
      name: 'Division' 
     }, 
     { 
      name: 'Income' 
     } 
    ] 
}, 
{ 
    name: 'Time Warner', 
    qualifiers: [ 
     { 
      name: 'Division' 
     } 
    ] 
} 
]; 



let subscription = [ 
    "Cinemax Subscription", 
    "Disney Subscription", 
    "Encore Subscription", 
    "Epix Subscription", 
    "HBO Subscription", 
    "MLB Subscription", 
    "NBA Subscription", 
    "NHL Subscription", 
    "Division" 
]; 


var filteredProfiles = profiles.reduce(function (collectedResults, profile) { 

    var newResults = profile.qualifiers.reduce(function(foundQualifiers, qualifier) { 

     if(subscription.indexOf(qualifier.name) > -1) { 
      return foundQualifiers.concat(qualifier.name); 
     } else { 
      return foundQualifiers; 
     } 

    }, []); 

    return collectedResults.concat(newResults); 

}, []); 

document.write(filteredProfiles); 
関連する問題