Функции cakephp, такие как Set:: comb в Javascript

Есть ли уже некоторые функции 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. Большое спасибо заранее!

Ответ 1

Нет. Javascript не имеет ничего подобного встроенному.

Либо вы сами выполняете эти функции, либо используете библиотеку, такую ​​как Underscore.js, которая предоставляет множество утилит вроде этого.

Ответ 2

Я бы любил, чтобы увидеть эквивалент 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.

Ответ 3

Это довольно просто в чистом javascript:

result = {}
a.forEach(function(item) {
    result[item.User.id] = item.User.name;
})

Я понимаю это только простой пример, но дело в том, что javascript поддерживает обратные вызовы и первоклассные функции, и просто нет необходимости в магии, например, "{n}.User.name".