Rotate groups in concat javascript arrays

I managed to split the array into separate groups based on the key value. I want to reach these groups, which can be more or less in an array, so my groups become [[Regio__c],[Categorie__c]]instead {Regio__c:[],Categorie__c:[]}. This is with regular javascript no libraries.

I tried: return [key].concat.split;returns undefined.

Below is my code in the snippet

var filter = [{
    "Id": "120",
    "arrayPicklist": "Categorie__c"
  }, {
    "Id": "121",
    "arrayPicklist": "Regio__c"
  },
  {
    "Id": "122",
    "arrayPicklist": "Categorie__c"
  }, {
    "Id": "123",
    "arrayPicklist": "Regio__c"
  },
  {
    "Id": "121",
    "arrayPicklist": "Regio__c"
  }
]


function splitArrayByValue(arr, key) {
  var split = {};
  for (var i = 0; i < arr.length; i++) {
    var p = arr[i][key];
    if (!split[p]) {
      split[p] = [];
    }
    split[p].push(arr[i])
  }
  return split;
}


var buckets2 = splitArrayByValue(filter, 'arrayPicklist');

console.log(buckets2);
Run codeHide result
+4
source share
6 answers

You are almost there, you need to get the values. An alternative is to use the functionObject.values

var filter = [{    "Id": "120",    "arrayPicklist": "Categorie__c"  }, {    "Id": "121",    "arrayPicklist": "Regio__c"  },  {    "Id": "122",    "arrayPicklist": "Categorie__c"  }, {    "Id": "123",    "arrayPicklist": "Regio__c"  },  {    "Id": "121",    "arrayPicklist": "Regio__c"  }]

function splitArrayByValue(arr, key) {
  var split = {};
  for (var i = 0; i < arr.length; i++) {
    var p = arr[i][key];
    if (!split[p]) {
      split[p] = [];
    }
    split[p].push(arr[i])
  }
  return Object.values(split);
}


var buckets2 = splitArrayByValue(filter, 'arrayPicklist');

console.log(buckets2);
Run codeHide result

You can use the function reduceto group and then the function Object.valuesto get the desired result.

var filter = [{"Id":"120","arrayPicklist":"Categorie__c"},{"Id":"121","arrayPicklist":"Regio__c"},{"Id":"122","arrayPicklist":"Categorie__c"},{"Id":"123","arrayPicklist":"Regio__c"},{"Id":"121","arrayPicklist":"Regio__c"}];

var result = Object.values(filter.reduce((a, {Id, arrayPicklist}) => {
  (a[arrayPicklist] || (a[arrayPicklist] = [])).push({Id, arrayPicklist});      
  return a;
}, {}));

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
Run codeHide result
+2
source

.reduce():

let data = [
  {"Id":"120", "arrayPicklist":"Categorie__c"},
  {"Id":"121", "arrayPicklist":"Regio__c"},
  {"Id":"122", "arrayPicklist":"Categorie__c"},
  {"Id":"123", "arrayPicklist":"Regio__c"},
  {"Id":"121", "arrayPicklist":"Regio__c"}
];

let keys = [...new Set(data.map(({arrayPicklist}) => arrayPicklist))];

/* 
 * let keys = ["Categorie__c", "Regio__c"];
 * In case you wants to use hard code values
 */

let result = data.reduce((r, c) => (
    r[keys.indexOf(c["arrayPicklist"])].push(c), r
), [[], []]);

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
Hide result

:

+2

Object.values(split) split splitArrayByValue.

var filter = [{"Id":"120","arrayPicklist":
"Categorie__c"},{"Id":"121","arrayPicklist":"Regio__c"},
{"Id":"122","arrayPicklist":"Categorie__c"},{"Id":"123","arrayPicklist":"Regio__c"},
{"Id":"121","arrayPicklist":"Regio__c"}]


function splitArrayByValue(arr, key) {
  var split = {};
  for (var i=0; i<arr.length; i++) {
    var p = arr[i][key];
    if (!split[p]) { split[p] = []; }
    split[p].push(arr[i])
  }
  return Object.values(split);//<---- just return Object.values(split) instead of split 
}


var buckets2 = splitArrayByValue(filter,'arrayPicklist');

console.log(buckets2);
Hide result
+2

(arrayPicklist). :

var array = [
    {"Id": "120", "arrayPicklist": "Categorie__c"},
    {"Id": "121", "arrayPicklist": "Regio__c"},
    {"Id": "122", "arrayPicklist": "Categorie__c"},
    {"Id": "123", "arrayPicklist": "Regio__c"},
    {"Id": "121", "arrayPicklist": "Regio__c"}
]

let groups = [...new Set(array.map(x => x.arrayPicklist))]
    .map(p => array.filter(x => x.arrayPicklist === p));

console.log(groups)
Hide result

, . ad-hoc javascript, . lodash :

let groups = _.values(_.groupBy(array, 'arrayPicklist'))

, Ramda:

let groups  = R.values(R.groupBy(x => x.arrayPicklist, array))
+2

, . , :

1. Object.values:

splitArrayByValue, :

return Object.values(split);

:

return split;

Object.values ECMAScript 2017. ECMA, ,

2. Object.keys Array#map:

, split :

return Object.keys(split).map(function(key) {
  return split[key];
});

, :

return Object.keys(split).map(key => split[key]);

: . . [[Regio__c], [Categorie__c]], [[Categorie__c], [Regio__c]], javascript -.

0

, 2D- , arrayPicklist. , map Set , .

var filter = [{"Id":"120","arrayPicklist":
"Categorie__c"},{"Id":"121","arrayPicklist":"Regio__c"},
{"Id":"122","arrayPicklist":"Categorie__c"},{"Id":"123","arrayPicklist":"Regio__c"},
{"Id":"121","arrayPicklist":"Regio__c"}]


function splitArrayByValue(arr, key) {
  let keys = arr.map(entry => {
    return entry[key];
  });

  let unique = [...new Set(keys.concat())]; 

  let split = new Array(unique.length);
  for (var i = 0; i < arr.length; i++) {
    let p = arr[i][key];
    let index = unique.indexOf(p);

    if (!split[index]) split[index] = [];
    split[index].push(arr[i])
  }
  return split;
}


var buckets2 = splitArrayByValue(filter,'Id');

console.log(buckets2);
0

Source: https://habr.com/ru/post/1695255/


All Articles