2017-11-17 3 views
1

私はこのような配列があります。は本当だANDアレイにエントリーエン一致するオブジェクトのキーを見つけることが

baseBreakpoints: [ 
    'xLarge', 
    'large', 
    'largeMedium', 
    'medium', 
    'smallMedium', 
    'small', 
    'xSmall' 
] 

を...と私はこのようなオブジェクトがあります:私は必要

breakpoints = { 
    "gtMedium": true, 
    "xLarge": true, 
    "gtLargeMedium": true, 
    "giant": false, 
    "small": false, 
    "ltLargeMedium": false, 
    "gtLarge": true, 
    "xSmall": false, 
    "largeMedium": false, 
    "medium": false, 
    "gtSmall": true, 
    "large": false, 
    "smallMedium": false 
} 

をオブジェクト内のキーを見つけるにはtrueが配列に存在しています。たとえば、上記の例では、値はオブジェクトのxLarge === trueからxLargeになり、breakpoints配列に存在します。

提案がありますか? Lodashはすでにプロジェクトに依存しています。

+0

@FelixSFD - なぜあなたは私のポストのうち可能な解決策を編集したのですか? –

+0

答えは答えとして書かれ、質問自体には追加されないので、 – FelixSFD

+0

私は安全ではない解決策として私を追加しました。フィードバックを得るための何か。答えとしてではありません。 –

答えて

4

かなり簡単検索。

var baseBreakpoints = ['xLarge', 'large', 'largeMedium', 'medium', 'smallMedium', 'small', 'xSmall'], 
 
    breakpoints = { gtMedium: true, xLarge: true, gtLargeMedium: true, giant: false, small: false, ltLargeMedium: false, gtLarge: true, xSmall: false, largeMedium: false, medium: false, gtSmall: true, large: false, smallMedium: false }, 
 
    result = baseBreakpoints.filter(k => breakpoints[k]); 
 
    
 
console.log(result);

ES5

var baseBreakpoints = ['xLarge', 'large', 'largeMedium', 'medium', 'smallMedium', 'small', 'xSmall'], 
 
    breakpoints = { gtMedium: true, xLarge: true, gtLargeMedium: true, giant: false, small: false, ltLargeMedium: false, gtLarge: true, xSmall: false, largeMedium: false, medium: false, gtSmall: true, large: false, smallMedium: false }, 
 
    result = baseBreakpoints.filter(function (k) { return breakpoints[k]; }); 
 
    
 
console.log(result);

+0

とてもエレガントなところでは – mplungjan

+0

私は一度だけ投票できます。鉱山はES <5;) – mplungjan

+0

フィルターは5.1ですか? – mplungjan

0

あなたはbreakpointsを検索することでbaseBreakpointsをフィルタリングすることができ

var baseBreakpoints = [ 
 
    'xLarge', 
 
    'large', 
 
    'largeMedium', 
 
    'medium', 
 
    'smallMedium', 
 
    'small', 
 
    'xSmall' 
 
]; 
 

 
var breakpoints = { 
 
    "gtMedium": true, 
 
    "xLarge": true, 
 
    "gtLargeMedium": true, 
 
    "giant": false, 
 
    "small": false, 
 
    "ltLargeMedium": false, 
 
    "gtLarge": true, 
 
    "xSmall": false, 
 
    "largeMedium": false, 
 
    "medium": false, 
 
    "gtSmall": true, 
 
    "large": false, 
 
    "smallMedium": false 
 
} 
 
var res = []; 
 
for (bp of baseBreakpoints) { 
 
    if (breakpoints[bp] != undefined && breakpoints[bp]) res.push(bp) 
 
} 
 
console.log(res)

1

あなたは、このアプローチを試すことができます。

キーが正真正銘であるかどうかの最初の条件チェック、2番目のキーが一致するかどうかをテストします。

この解決策は他の正解と比較して、フィルタリングされた配列ではなく純粋な文字列を返します。

let baseBreakpoints = ['xLarge', 'large', 'largeMedium', 'medium', 
 
'smallMedium', 'small', 'xSmall']; 
 

 
let breakpoints = { 
 
    "gtMedium": true, 
 
    "xLarge": true, 
 
    "gtLargeMedium": true, 
 
    "giant": false, 
 
    "small": false, 
 
    "ltLargeMedium": false, 
 
    "gtLarge": true, 
 
    "xSmall": false, 
 
    "largeMedium": false, 
 
    "medium": false, 
 
    "gtSmall": true, 
 
    "large": false, 
 
    "smallMedium": false 
 
} 
 

 
let key = Object.keys(breakpoints).find(key => { 
 
    return breakpoints[key] 
 
    && baseBreakpoints.some(breakpoint => breakpoint === key); 
 
}) 
 

 
console.log(key);

+0

ここで解決策を掲載しないでください。 – mplungjan

+0

'some'の代わりに' includes'メソッドを使うこともできます。これはもっと速くなると思いますか? – Taurus

+0

@mplungjan私の答えの中に解決策を追加しました:) – Karim

関連する問題