2016-05-12 2 views
0

Я пытаюсь получить уникальные элементы в каждом столбце массива json. Я хочу, чтобы преобразовать это:Разбиение jsonarray на основе ключа с помощью lodash underscore

элементы вар = [{ "Имя": "Тип 1", "идентификатор": 13}, { "имя": "Тип 2", "ID": 14} , {"name": "Type 3", "id": 14}, {"name": "Type 3", "id": 13}, {"name": "Type 2", "id": 12}, {"name": "Тип 3", "id": 12}];

в

[{ "Тип 1", "Тип 2", "Тип 3"}, {12,13,14}]

Это то, что я пытался :

var uniq1 = _.map(_.uniqBy(items, 'id'), 'id'); 
var uniq2 =_.map(_.uniqBy(items, 'name'), 'name') 
console.log(uniq1,uniq2) 

Fiddle: https://jsfiddle.net/yogeshwaran/5ntfzss1/

Но это, кажется, т o быть неэффективным решением для моего варианта использования, так как мой реальный набор данных намного больше (100000 элементов с 6 ключами в каждом элементе). Есть ли способ получить все уникальные значения для каждого из ключей. Я не хочу перебирать весь набор каждый раз. Мой идеальный подход: 1. Разделите массив на основе ключей. 2. Затем найдите уникальный в каждом из разделов. 3. Присоедините результаты.

Спасибо.

+0

Вы можете использовать ванильный JS или новый js Устанавливает (следить за поддержкой браузера), чтобы сделать более эффективным – juvian

+0

Выполняете ли вы это в браузере для веб-приложения или только для обработки данных JSON? Если последний, я рекомендую использовать 'jq' для обработки больших наборов данных JSON и имеет много приятных [вспомогательных функций] (https://stedolan.github.io/jq/manual/#TypesandValues). – aug

ответ

1

Вы можете использовать комбинацию _.values() для преобразования объекта в массив, _.zip() транспонировать массивы, а затем сопоставить их с _.uniq():

var items = [ 
 
    {"name": "Type 1","id": 13, "position": "manager"}, 
 
    {"name": "Type 2","id": 14, "position": "manager"}, 
 
    {"name": "Type 3","id": 14, "position": "manager"}, 
 
    {"name": "Type 3","id": 13, "position": "worker"}, 
 
    {"name": "Type 2","id": 12, "position": "worker"}, 
 
    {"name": "Type 3","id": 12, "position": "manager"} 
 
]; 
 

 
var result = _.zip.apply(_, items.map(_.values)).map(_.uniq); 
 

 
console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.16.6/lodash.min.js"></script>