Группировка данных по ключу объекта и создание массива

1

У меня есть набор данных, которые я сгруппировал по ключу объекта. Для каждого ключа объекта мне нужно создать массив идентификатора. Поэтому вместо массива объекта это просто плоский массив идентификаторов.

Мне удалось вернуть данные, но, похоже, не может получить только идентификатор.

Вот набор данных

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]
Теги:
arrays

4 ответа

1
Лучший ответ

Вместо возврата из 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);
1

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))
0

Вы можете использовать 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 );
0

Используйте 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)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню