Как создавать таблицы с сгруппированными элементами, используя ES6 - PullRequest
0 голосов
/ 22 февраля 2020

Как создавать таблицы с сгруппированными элементами, используя ES6

У меня есть объекты в массиве:

  [ { keyOne: 1 } 
  , { keyOne: 2, keyTwo  :  3 } 
  , { keyOne: 2, keyThree:  2 } 
  , { keyOne: 4, keyFour : 32 } 
  ]

, если KeyOne имеет тот же ключ и значение, я создам новый массив: output:

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

  [ [ { keyOne: 1 }] 
  , [ { keyOne: 2, keyTwo :  3 }, { keyOne: 2, keyThree: 2 }] 
  , [ { keyOne: 4, keyFour: 32 }] 
  ] 

Ответы [ 3 ]

1 голос
/ 22 февраля 2020

Вы должны показать некоторые из своих эссе ... и обратить внимание на имена переменных, Javascript чувствителен к регистру ([{* k eyOne: 1}, { K eyOne: 2,)

const data = 
      [ { keyOne: 1 } 
      , { keyOne: 2, keyTwo  : 3 } 
      , { keyOne: 2, keyThree: 2 } 
      , { keyOne: 4, keyFour : 32} 
      ] 

const result = data.reduce((a,c)=>
                {
                if (a.some(e=>e.some(l=>l.keyOne===c.keyOne)))
                  { (a.find(e=>e[0].keyOne===c.keyOne)).push( {...c} ) }
                else
                  { a.push( [ {...c} ] ) }   
                return a
                }, [])


result.forEach((r,i)=>console.log(`${i} -> ${ JSON.stringify(r)}`))
.as-console-wrapper { max-height: 100% !important; top: 0; background-color: turquoise; }
1 голос
/ 22 февраля 2020

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

Итак, в качестве решения вашей проблемы я создал функцию который примет массив и имя ключа в качестве параметров и вернет группировки.

const givenArr = [{KeyOne: 1,KeyTwo:2},{KeyOne:2, KeyTwo:3}, {KeyOne:2,KeyTwo: 2, KeyThree:2}, {KeyOne: 4,KeyTwo: 3, KeyFour:32}]



const getGroupingsByKey = (arr,key) => {

	let valueToArrayMap = {};
	arr.forEach(obj => {
		if(!valueToArrayMap[obj[key]]){
			valueToArrayMap[obj[key]] = [];
		}
		valueToArrayMap[obj[key]].push(obj);
	})
	return Object.keys(valueToArrayMap).reduce((targetArr,currentKey) => {
		targetArr.push(valueToArrayMap[currentKey]);
		return targetArr;
	},[]);
}

console.log("Group by KeyOne\n",getGroupingsByKey(givenArr,"KeyOne"));
console.log("Group by KeyTwo\n",getGroupingsByKey(givenArr,"KeyTwo"));

Пожалуйста, дайте мне знать, если это не решит вашу проблему, чтобы я мог ее исправить.

0 голосов
/ 23 февраля 2020

Я нашел более быстрое решение

[...new Set(data.map(({ keyOne }) => keyOne))].map(a => data.filter(({keyOne}) => a === keyOne))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...