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