在underscore.js中按对象键查找

时间:2011-11-24 05:22:35

标签: javascript 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;
  });

这是我第一次听到这么多关于它的下划线。 任何帮助,超过欢迎

3 个答案:

答案 0 :(得分:20)

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' })

答案 1 :(得分:4)

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评估为truefalse,具体取决于button是否包含'join'作为关键字。 (The in operator是一个常规的JavaScript运算符,而不是由underscore.js添加的。)

答案 2 :(得分:1)

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]))