Ответ 1
Нет. Javascript не имеет ничего подобного встроенному.
Либо вы сами выполняете эти функции, либо используете библиотеку, такую как Underscore.js, которая предоставляет множество утилит вроде этого.
Есть ли уже некоторые функции javascript, которые выполняют те же функции, что и функции cakephp Set:: comb и Set:: classicExtract на стороне клиента в браузере? http://book.cakephp.org/2.0/en/core-utility-libraries/set.html
Так что я могу привести этот массив:
a = [
{
'User' : {
'id' : 2,
'group_id' : 1,
'name' : 'Alfred'
}
},
{
'User' : {
'id' : 12,
'group_id' : 2,
'name' : 'Albert'
}
}
]
с такой функцией, как
Set::combine(a, '{n}.User.id', '{n}.User.name')
в формате
a = {
2 : 'Alfred',
12 : 'Albert'
}
например. Но это не только для этого простого примера, я действительно ищу библиотеку или что-то такое, что можно сделать так же, как cakephp. Большое спасибо заранее!
Нет. Javascript не имеет ничего подобного встроенному.
Либо вы сами выполняете эти функции, либо используете библиотеку, такую как Underscore.js, которая предоставляет множество утилит вроде этого.
Я бы любил, чтобы увидеть эквивалент JS для класса Hash CakePHP, но, к сожалению, через час Googling я ничего не могу найти... Underscore.js и Sugar.js имеют некоторые функции фильтрации, но ни один из них не работает на многомерных массивах.
В Торт я часто делаю такие вещи...
Hash::extract($users, '{n}.User.Posts.{n}.Comments.{n}[published=1]');
Если кто-то знает библиотеку JS, которая делает это, будет очень благодарна за подсказку.
EDIT: с тех пор я нашел несколько опций, которые разрешают такой запрос данных JSON (с примерами используемого ими синтаксиса).
JSPath
.automobiles{.maker === "Honda" && .year > 2009}.model
json: select() (больше вдохновлен CSS-селекторами)
.automobiles .maker:val("Honda") .model
JSONPath (больше вдохновил XPath)
$.automobiles[?(@.maker='Honda')].model
Я думаю, что JSPath выглядит красивее, поэтому я собираюсь попытаться интегрировать его с моим приложением AngularJS + CakePHP.
Это довольно просто в чистом javascript:
result = {}
a.forEach(function(item) {
result[item.User.id] = item.User.name;
})
Я понимаю это только простой пример, но дело в том, что javascript поддерживает обратные вызовы и первоклассные функции, и просто нет необходимости в магии, например, "{n}.User.name".