Группировать объекты по одному из его параметров с javascript - PullRequest
1 голос
/ 14 февраля 2020

По сути, я хотел бы преобразовать это

[
  { key: 0, name: 'Some name' },
  { key: 0, name: 'Some name' },
  { key: 1, name: 'Some name' },
  { key: 1, name: 'Some name' },
]

в это, где каждый объект с ключом 0 будет go в первый массив, а каждый объект с ключом 1 будет go в второй массив.

[
  [
    { key: 0, name: 'Some name' },
    { key: 0, name: 'Some name' },
  ],
  [
    { key: 1, name: 'Some name' },
    { key: 1, name: 'Some name' },
  ],
];

Не против использовать loda sh для этого, но не может найти правильный метод массива.

Ответы [ 5 ]

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

Вот как я бы решил это с reduce:

const firstArray = [
  { key: 0, name: 'Some name' },
  { key: 0, name: 'Some name' },
  { key: 1, name: 'Some name' },
  { key: 1, name: 'Some name' },
]

const secondArray = firstArray.reduce((acc, elem) => {
  acc[elem.key] = [...(acc[elem.key] || []), elem];
  return acc
}, [])

console.log(secondArray)
0 голосов
/ 14 февраля 2020

Этого можно добиться, просто зацикливая существующий массив и отправляя результаты во вновь созданный многомерный массив. Это, на мой взгляд, самый читаемый способ.

const mainArray = [
  { key: 0, name: 'Some name' },
  { key: 0, name: 'Some name' },
  { key: 1, name: 'Some name' },
  { key: 1, name: 'Some name' },
];

// create an empty array to store our results
const result = [];

mainArray.forEach(x => {
  const key = x.key;
  // Instantiate a new array if it does not exist 
  // for the given key.
  if (!result[key]) {
  	result[key] = [];
  }
  
  // push the object to the array
  result[key].push(x)
});

console.log(result);
0 голосов
/ 14 февраля 2020
var array = [
  { key: 0, name: 'Some name' },
  { key: 0, name: 'Some name' },
  { key: 1, name: 'Some name' },
  { key: 1, name: 'Some name' },
];
array.sort(function(a,b){return a.key - b.key})
var temp = array[0].key;
var newArray = [];
var tempArray =[];
for(var i=0;i<array.length;i++){
    if(temp != array[i].key){
        newArray.push(tempArray);
        tempArray =[];
        temp = array[i].key;
    }
    tempArray.push(array[i]);
}
newArray.push(tempArray);
0 голосов
/ 14 февраля 2020

 function groupData(){
       var mainArray = [
        { key: 0, name: 'Some name' },
        { key: 0, name: 'Some name' },
        { key: 1, name: 'Some name' },
        { key: 1, name: 'Some name' },
      ];  
      
      var unique = [...new Set(mainArray.map(item => item.key))];
      	var tempArrays = new Array(parseInt(unique.length));   
      	for(var k = 0; k < unique.length; k++){
        if(! tempArrays[k] ){
        	tempArrays[k] = [];
        }
         
          for(var i = 0; i < mainArray.length; i++){
    		if (mainArray[i].key == unique[k]){        	 
              tempArrays[k].push(mainArray[i]);
             }
          }  
        }
        console.log(tempArrays);
    }
<input type="button" onClick="groupData();" value="Group Data">
0 голосов
/ 14 февраля 2020

Вы должны иметь возможность использовать Array.reduce для этой цели

loda sh предлагает функцию groupBy , которая прекрасно подходит для этого приложения.

Например:

let a = [
  { key: 0, name: 'Some name' },
  { key: 0, name: 'Some name' },
  { key: 1, name: 'Some name' },
  { key: 1, name: 'Some name' },
];

let res = Object.values(a.reduce((acc, r) => { 
    acc[r.key] = (acc[r.key] || []).concat([r]);
    return acc;
}, {}));


console.log("Result:",res);


// You can also use lodash groupBy (which is more concise)
console.log("Using lodash:",Object.values(_.groupBy(a, "key")))
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.min.js"></script>
...