Поиск по объекту в 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;
  });

Это первый раз, когда я использовал подчеркивание, услышав об этом много. Любая помощь, более чем приветствуется

Ответ 1

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

Ответ 2

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 > или false, в зависимости от того, содержит ли button 'join' в качестве ключа. (Оператор in является обычным оператором JavaScript, а не добавлением underscore.js.)

Ответ 3

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