Вы можете использовать reduce
и деструктуризацию следующим образом:
Идея состоит в том, чтобы создать объект с key
как свойство name
и значение в качестве конечных объектов, которые вам нужны в выводе. Таким образом, вы можете просто использовать Object.values
для получения окончательного массива:
const arr=[{name:"aa",type:"total",count:28394},{name:"aa",type:"featured",count:4},{name:"aa",type:"noAnswers",count:5816},{name:"ba",type:"total",count:148902},{name:"ba",type:"featured",count:13},{name:"ba",type:"noAnswers",count:32527},{name:"cc",type:"total",count:120531},{name:"cc",type:"featured",count:6},{name:"cc",type:"noAnswers",count:24170}];
const merged = arr.reduce((acc,{name,type,count}) =>
((acc[name] = acc[name] || {name})[type] = count, acc)
,{})
console.log(Object.values(merged))
This эквивалентно:
const arr=[{name:"aa",type:"total",count:28394},{name:"aa",type:"featured",count:4},{name:"aa",type:"noAnswers",count:5816},{name:"ba",type:"total",count:148902},{name:"ba",type:"featured",count:13},{name:"ba",type:"noAnswers",count:32527},{name:"cc",type:"total",count:120531},{name:"cc",type:"featured",count:6},{name:"cc",type:"noAnswers",count:24170}];
/* Our goal is to create a merged object like this:
{
"aa": {
"name": "aa",
"total": 28394,
"featured": 4,
"noAnswers": 5816
},
"ba": {
"name": "ba",
"total": 148902,
....
},
"cc": {
"name": "cc",
......
}
}
The advantage of using object accumulator is we can access it like this: acc[name]
*/
const merged = arr.reduce((acc, {name,type,count} /*Destructuring*/) => {
/* if the accumulator doesn't have the current "name" key,
create new object
else use the existing one;
{name} is same as {name: name}
*/
acc[name] = acc[name] || {name};
/* To the inner object,
add a key with the "type" value and assign it to "count" value
*/
acc[name][type] = count;
// return the accumulator
return acc;
}, {})
// use Object.values to get the value part of the merged obejct into an array
console.log(Object.values(merged))
Если Вы хотите смочь добавить и удалить объекты из существующего поля комбинированного списка во времени выполнения, базовой моделью данных для поля комбинированного списка должен быть MutableComboBoxModel
Google для того класса для интерфейсной информации и для примеров того, как использовать его.
Обратите внимание, что, если Вы хотите, чтобы пользователь ввел в новых значениях, также необходимо сделать поле доступным для редактирования.
Можно найти некоторые ссылки на примеры здесь.
Конечно, Вы можете. Существует несколько методов для управления JComboBoxes с помощью модели списка по умолчанию. Взгляните на удаление* методы и добавьте* методы:
http://java.sun.com/javase/6/docs/api/javax/swing/JComboBox.html
Можно также заменить модель в целом setModel ().
Но после записи все большего количества пользовательских интерфейсов, я нахожу более полезным записать пользовательский ComboBoxModel для обертывания структуры данных, которую представляет ComboBox. Это - больше единицы, тестируемой и более чистой, по моему скромному мнению.
Библиотека Glazed Lists могущественная полезный, когда Вы хотите соединить любой вид проводом изменяемого списка к управлению GUI. Это - библиотека большого выхода, которая не может подходить для Вашего проекта, но смотреть на их скринкасты и судью для себя. Это поддерживает много связанного материала как фильтрация и автозавершение и может сохранить Вас большой физический труд.