2014-02-04 3 views
13

Я только недавно обнаружил силу underscore.js, еще новичок в методы я любезно прошу предложение:Underscore.js - получить уникальное свойство значения

Как получить от этого:

[ 
    [{ 
     "name": "Type 2", 
     "id": 14 
    }], 
    [{ 
     "name": "Type 1", 
     "id": 13 
    }, { 
     "name": "Type 3", 
     "id": 15 
    }], 
    [{ 
     "name": "Type 2", 
     "id": 14 
    }], 
    [{ 
     "name": "Type 1", 
     "id": 13 
    }] 
] 

к этому:

["Type 1","Type 2","Type 3"] 

т.е. не дублируется и "имя" собственность только.

Любые предложения, которые были высоко оценены.

+0

Пробовали ли вы что-нибудь? Это должно быть просто. – undefined

+0

@BlackSheep - Я смог сделать это за пару шагов. Но мне не хватало метод «сплющивания», который делает возможным цепочку. – Iladarsda

ответ

26
_(data).chain().flatten().pluck('name').unique().value() 

(Преобразование вложенных списков в плоскому, выберите name из каждого из объектов в списке и сделайте это u Nique.)

+1

Есть ли какая-либо особенность в методах цепочки в подчеркивании/lo-тире по сравнению с вложением (как в ответе МакГарнагля). Или это чисто для эстетики/ясности кода? – nverba

+0

В lodash более эффективно, если вы создаете оболочку с '_()', если вы объединяете несколько методов вместе, менее эффективны, если вы выполняете только одну (возможно, две) операции. Сделайте свои собственные тесты для каждой ситуации. – kmiyashiro

10
  • Сначала используйте flatten, чтобы преобразовать вложенный массив в плоский массив.
  • Тогда pluck получить значения "имя" как массив
  • Наконец uniq

_.uniq(_.pluck(_.flatten(items), "name")) 

Fiddle

2
var arr = _.uniq(_.map(_.flatten(array), function(e) { 
    return e.name; 
})); 
1
_.uniq(_.pluck(x,'name')); 

приведенный выше код является достаточным для извлечения другого "имя" атрибут

Смежные вопросы