Не могу составить массив

У меня есть массив

 [
   {
    "spearman_coefficient": -0.18,
    "spearman_pvalue": 0.00002802,
    "mutual_information": 18
   },
   {
    "spearman_coefficient": -0.18,
    "spearman_pvalue": 0.00002533,
    "mutual_information": 15
   },
   {
    "spearman_coefficient": -0.07,
    "spearman_pvalue": 0.1247,
    "mutual_information": 14
   },
   {
    "spearman_coefficient": -0.05,
    "spearman_pvalue": 0.2215,
    "mutual_information": 14
   },
   {
    "spearman_coefficient": -0.11,
    "spearman_pvalue": 0.01171,
    "mutual_information": 16
   }
]

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

[ 
    ['mutual_information',18,15,14,14],
    ['spearman_coefficient',18,15,14,14],
    ['sperman_pvalue',18,15,14,14]
]

Пытался пройти методом foreach и вытащить в пустой массив входные и как-то попытаться сопоставить... безуспешно...

    arr.forEach(i=>{
        a.push(Object.entries(i));
    })

Буду рад любой помощи. введите сюда описание изображения


Ответы (1 шт):

Автор решения: Alex Krass

Создаем пустой массив, который будет хранить значения. Далее проходимся в цикле по массиву и названиям свойств через for-in и проверяем, есть ли в нем уже массив с таким названием prev.find(x => x[0] === prop). Если нет добавляем, а дальше берем его добавляем наши значения prev.filter(x => x[0] === prop)[0].push(current[prop]).

В данном случае используется reduce, где prev это исходный пустой массив для заполнения и current текущий элемент, но можно и обычным циклом.

let info = [
   {
    "spearman_coefficient": -0.18,
    "spearman_pvalue": 0.00002802,
    "mutual_information": 18
   },
   {
    "spearman_coefficient": -0.18,
    "spearman_pvalue": 0.00002533,
    "mutual_information": 15
   },
   {
    "spearman_coefficient": -0.07,
    "spearman_pvalue": 0.1247,
    "mutual_information": 14
   },
   {
    "spearman_coefficient": -0.05,
    "spearman_pvalue": 0.2215,
    "mutual_information": 14
   },
   {
    "spearman_coefficient": -0.11,
    "spearman_pvalue": 0.01171,
    "mutual_information": 16
   }
]

let result = info.reduce((prev, current) => {
    for(var prop in current) {
        if (!prev.find(x => x[0] === prop))
            prev.push([prop]);
        prev.filter(x => x[0] === prop)[0].push(current[prop])   
    }
    return prev;
}, [])

console.log(result)

→ Ссылка