У меня есть набор данных, которые я сгруппировал по ключу объекта. Для каждого ключа объекта мне нужно создать массив идентификатора. Поэтому вместо массива объекта это просто плоский массив идентификаторов.
Мне удалось вернуть данные, но, похоже, не может получить только идентификатор.
Вот набор данных
let result = {
"age_group_ids": [
{
"id": 5
},
{
"id": 4
},
{
"id": 3
},
{
"id": 9
}
],
"family_group_ids": [
{
"id": 2
},
{
"id": 1
}
],
"earnings_group_ids": [
{
"id": 7
},
{
"id": 6
}
]
}
Это функция, которую я написал, но она не работает.
Object.keys(result).forEach(key => {
return result[key].map(item => {
item.id
})
})
Конечный результат: мне нужен такой объект
{"age_group_ids": [5,4, 3, 9],
"family_group_ids": [2, 1],
"earnings_group_ids": [7,6]
Вместо возврата из forEach
присвойте результаты result[key]
. Удалены фигурные скобки item.id
элемента. item.id
, поэтому значение будет добавлено в массив.
const result = {"age_group_ids":[{"id":5},{"id":4},{"id":3},{"id":9}],"family_group_ids":[{"id":2},{"id":1}],"earnings_group_ids":[{"id":7},{"id":6}]};
Object.keys(result).forEach(key => {
result[key] = result[key].map(item => item.id)
})
console.log(result);
let result = {"age_group_ids":[{"id":5},{"id":4},{"id":3},{"id":9}],"family_group_ids":[{"id":2},{"id":1}],"earnings_group_ids":[{"id":7},{"id":6}]};
function groupById(groups) {
return Object.keys(groups).reduce((result, key) => {
result[key] = result[key] || [];
result[key] = groups[key].map(o => o.id);
return result;
}, {});
}
console.log(groupById(result))
Вы можете использовать Object.entries
для преобразования объекта в массив. Используйте reduce
чтобы организовать массив и использовать Object.assign
для добавления ключей и значений в накопитель.
let obj = {
"age_group_ids":[{"id":5},{"id":4},{"id":3},{"id":9}],
"family_group_ids":[{"id":2},{"id":1}],
"earnings_group_ids":[{"id":7},{"id":6}]
}
var result = Object.entries(obj).reduce((c, [k, v]) => Object.assign(c, {[k]: v.map(({id}) => id)}), {});
console.log( result );
Используйте Array.prototype.reduce()
вместо Array.prototype.forEach()
и Object.entries()
для удобства, поэтому вам не нужно использовать ссылочную ссылку для result[key]
. Вы также можете использовать деструктурирование объекта для ссылки на key
, values
и id
более кратким образом. Не забывайте, что вам нужно инициализировать acc
для пустого объекта для callback reduce()
:
const result = {age_group_ids:[{id:5},{id:4},{id:3},{id:9}],family_group_ids:[{id:2},{id:1}],earnings_group_ids:[{id:7},{id:6}]}
const output = Object.entries(result).reduce((acc, [key, values]) => Object.assign(acc, {
[key]: values.map(({ id }) => id)
}), {})
console.log(output)