2016-09-09 2 views
3

Я хочу, чтобы найти самый короткий и самый красивый способ преобразовать массив объектов с одинаковыми значениями ключа категории:Необходимо объединить объекты с одинаковыми ключами, но разными значениями

[{ 
    "label": "Apple", 
    "category": "Fruits" 
}, { 
    "label": "Orange", 
    "category": "Fruits" 
}, { 
    "label": "Potato", 
    "category": "Vegetables" 
}, { 
    "label": "Tomato", 
    "category": "Vegetables" 
}, { 
    "label": "Cherry", 
    "category": "Berries" 
}] 

на один с сгруппированные этикетки из той же категории:

[{ 
    "label": ["Apple", "Orange"], 
    "category": "Fruits" 
}, { 
    "label": ["Potato", "Tomato"], 
    "category": "Vegetables" 
}, { 
    "label": ["Cherry"], 
    "category": "Berries" 
}] 

ответ

4

Вы можете использовать объект в качестве хеш-таблицы и группировать категории.

var data = [{ "label": "Apple", "category": "Fruits" }, { "label": "Orange", "category": "Fruits" }, { "label": "Potato", "category": "Vegetables" }, { "label": "Tomato", "category": "Vegetables" }, { "label": "Cherry", "category": "Berries" }], 
 
    grouped = []; 
 

 
data.forEach(function (a) { 
 
    if (!this[a.category]) { 
 
     this[a.category] = { label: [], category: a.category }; 
 
     grouped.push(this[a.category]); 
 
    } 
 
    this[a.category].label.push(a.label); 
 
}, Object.create(null)); 
 

 
console.log(grouped);
.as-console-wrapper { max-height: 100% !important; top: 0; }

+1

Большое спасибо !!! – daslashi

1

Вот моя попытка решить вашу проблему

var result = []; 
 
var input = [{ 
 
    "label": "Apple", 
 
    "category": "Fruits" 
 
}, { 
 
    "label": "Orange", 
 
    "category": "Fruits" 
 
}, { 
 
    "label": "Potato", 
 
    "category": "Vegetables" 
 
}, { 
 
    "label": "Tomato", 
 
    "category": "Vegetables" 
 
}, { 
 
    "label": "Cherry", 
 
    "category": "Berries" 
 
}]; 
 
var cat = []; 
 
for(i = 0; i < input.length; i++) { 
 
    if(!cat[input[i].category]) { 
 
    cat[input[i].category] = {category: input[i].category, label:[input[i].label]}; 
 
    result.push(cat[input[i].category]); 
 
    } else { 
 
    cat[input[i].category].label.push(input[i].label); 
 
    } 
 
} 
 
console.log(result);

2

Вот как я хотел бы сделать это с помощью lodash:

_(coll) 
    .groupBy('category') 
    .map((v, k) => ({ 
    category: k, 
    label: _.map(v, 'label') 
    })) 
    .value() 

В принципе, groupBy() создает объект с уникальными категориями в качестве ключей. Затем map() превращает этот объект обратно в массив, где каждый элемент имеет необходимую структуру.

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