2017-07-13 82 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); 
     } 
    }) 
}); 

我if語句裏面看到的是

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. 

我看到它是如何開始失效。但我不確定如何正確地循環訪問** 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

您正在尋找這樣的事情,結帳我的代碼

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); 
相關問題