web-dev-qa-db-ja.com

underscore.jsのオブジェクトキーによる検索

私は次のオブジェクトを持っています

{ join: {} }

以下の配列からデフォルトのオブジェクトを見つけたいのですが

[
    { login: { label: 'Login', url: '#login' } },
    { join: { label: 'Join', url: '#join', theme: 'a' } },
    { home: { label: 'none', icon: 'home', url: '#', theme: 'a' } }
]

配列をループしてキーを一致させたいのですが、この場合は'join'

これは私がこれまでに持っているものです:

 var butt_to_find = { join: {} }
 var all_buttons = 'array above'
 var matching = _.find(all_buttons, function(default_button){
 return if default_butt key @ 1 is the same as butt_to_find key @ 1;
  });

アンダースコアについて多くのことを聞いた後、アンダースコアを使用したのはこれが初めてです。どんな助けでも、歓迎以上に

11
Chin
var buttons = [
  { login: { label: 'Login', url: '#login' } },
  { join: { label: 'Join', url: '#join', theme: 'a' } },
  { home: { label: 'none', icon: 'home', url: '#', theme: 'a' } }
]

_.find(buttons, function (button) { return 'join' in button })

問題は、次善のデータ構造を使用していることです。これはより理にかなっており、より単純なコードを生成します。

var buttons = {
  login: {label: 'Login', url: '#login'},
  join: {label: 'Join', url: '#join', theme: 'a'},
  home: {label: 'none', icon: 'home', url: '#', theme: 'a'}
}

buttons.join // equivalent to the `_.find` line in the first example (but much simpler)

ボタンの順序が重要であるため、おそらく配列を使用しています。この場合、配列の配列を使用します。

var buttons = [
  ['login', {label: 'Login', url: '#login'}],
  ['join', {label: 'Join', url: '#join', theme: 'a'}],
  ['home', {label: 'none', icon: 'home', url: '#', theme: 'a'}]
]

_.find(buttons, function (button) { return button[0] === 'join' })
20
davidchambers
_var matching =
( _.find
  ( all_buttons,
    function (button)
    { return _.keys(butt_to_find)[0] in button;
    }
  )
);
_

ここで、_.keys(butt_to_find)は_['join']_(_butt_to_find_のキーを含む配列)と評価され、_.keys(butt_to_find)[0]は_'join'_(上記の配列の最初の要素)と評価されます。 )、および_.keys(butt_to_find)[0] in buttonは、trueにキーとして_'join'_が含まれているかどうかに応じて、falseまたはbuttonのいずれかに評価されます。 ( in演算子 は通常のJavaScript演算子であり、underscore.jsによって追加されたものではありません。)

4
ruakh
var def = {join: {}}
var defs = [
    { login: { label: 'Login', url: '#login' } },
    { join: { label: 'Join', url: '#join', theme: 'a' } },
    { home: { label: 'none', icon: 'home', url: '#', theme: 'a' } }
]
_.find(defs,function(item,key){
    return _.has(item,_.keys(def)[0])
})

Lodashライブラリ(アンダースコアのバージョンのドロップ)に切り替えて、これを行うこともできます

_.compact(_.pluck(defs,_.keys(def)[0]))
1
Shanimal