2015-03-24 5 views
1

Моей JSON выглядит следующим образом:Получить уникальные предметы - Рули

{ 
    "features": [ 
    { 
     "id": "belly", 
     "scenarios": [ 
     { 
      "id": "belly;a-few-cukes", 
      "tags": [ 
      { 
       "name": "@tag1" 
      } 
      ], 
      "steps": [ 
      { 
       "name": "I have 42 cukes in my belly" 
      }, 
      { 
       "name": "I wait 1 hour" 
      }, 
      { 
       "name": "my belly should growls" 
      } 
      ] 
     }, 
     { 
      "id": "belly;a-few-cukes-with-new-test", 
      "tags": [ 
      { 
       "name": "@tag2" 
      } 
      ], 
      "steps": [ 
      { 
       "name": "I have 42 cukes in my belly" 
      }, 
      { 
       "name": "I wait 1 hour" 
      }, 
      { 
       "name": "my belly should growl" 
      } 
      ] 
     } 
     ] 
    }, 
    { 
     "id": "newbelly", 
     "scenarios": [ 
     { 
      "id": "newbelly;a-few-cukes-with-new-feature", 
      "tags": [ 
      { 
       "name": "@tag1" 
      } 
      ], 
      "steps": [ 
      { 
       "name": "I have 42 cukes in my belly" 
      }, 
      { 
       "name": "I wait 1 hour" 
      }, 
      { 
       "name": "my belly should growls" 
      } 
      ] 
     } 
     ] 
    } 
    ] 
} 

Я хотел бы получить все уникальные имена тегов: то есть @ tag1, @ tag2. Если вы заметили, @ tag1 повторяется дважды.

Мой шаблон:

{{#getTags features}} 
    {{#scenarios}} 
     {{#tags}} 
      <p>{{name}}</p> 
     {{/tags}} 
    {{/scenarios}} 
{{/getTags}} 

Пользовательские Helper, что я создал до сих пор:

Handlebars.registerHelper('getTags', function(context, block) { 
    var ret = ""; 

    for (var i = 0; i < context.length; i++) { 
     ret += block.fn(context[i]); 
    }; 

    return ret; 
}); 

выше пользовательский помощник возвращает все теги, но я хочу уникальных.

ответ

0

Что-то вдоль этих линий может работать:

Handlebars.registerHelper('getTags', function(context, block) { 
var ret = ""; 
var got = []; 

function contains(obj, a) { 
    for (var i = 0; i < a.length; i++) { 
     if (a[i] === obj) { 
      return true; 
     } 
    } 
return false; 
} 

for (var i = 0; i < context.length; i++) { 
    if (!this.contains(context[i],got)) { 
     got.addObject(context[i]); 
     ret += block.fn(context[i]); 
    } 
} 

return ret; 
}); 

код, используемый для тестирования, все JavaScript:

var ret = ""; 
var got = []; 
var data = ["tag1", "tag1", "tag2", "tag3"] 

function contains(obj, a) { 
    for (var i = 0; i < a.length; i++) { 
     if (a[i] === obj) { 
      return true; 
     } 
    } 
return false; 
} 

for (var i = 0; i < data.length; i++) { 
    if (!contains(data[i],got)) { 
     got.push(data[i]); 
     ret += data[i]; 
     } 
} 

console.log(ret); 
+0

Я получаю 'Uncaught TypeError: не определено не ошибка function' в консоли. –

+0

Я привык к Ember, поэтому возможно, что функция Ember проскользнула в мой код! Какая строка вызывает ошибку? – millerbr

+0

Я думаю, строка 'got.contains' вызывает ошибку. –