J'ai un tableau comme celui-ci:

[
{
    "title": "name",
    "value": ""
},
{
    "title": "version",
    "value": ""
},
{
    "title": "inventory_name",
    "value": ""
},
{
    "title": "inventory_version",
    "value": ""
},
{
    "title": "differed",
    "value": ""
},
{
    "title": "differed_name",
    "value": ""
},
{
    "title": "accept_error_while_reboot",
    "value": ""
},
{
    "title": "setup_check",
    "value": ""
},
{
    "title": "setup_install",
    "value": ""
},
{
    "title": "setup_install_partial",
    "value": ""
},
{
    "title": "params_install",
    "value": ""
},
{
    "title": "params_install_partial",
    "value": ""
},
{
    "title": "results_install_ok",
    "value": ""
},
{
    "title": "results_install_reboot_defered",
    "value": ""
},
{
    "title": "results_install_reboot_immediate",
    "value": ""
},
{
    "title": "results_install_partial_ok",
    "value": ""
},
{
    "title": "results_install_partial_reboot_defered",
    "value": ""
},
{
    "title": "results_install_partial_reboot_immediate",
    "value": ""
}
];

Est-il possible de créer des sous-tableaux contenant la même chaîne de champ de titre?

Par exemple dans ce cas, j'aurai:

array1 = [
 {
  "title": "differed",
  "value": ""
 },
 {
  "title": "differed_name",
  "value": ""
 }
]

array2 = [
 {
  "title": "setup_check",
  "value": ""
 },
 {
  "title": "setup_install",
  "value": ""
 },
 {
  "title": "setup_install_partial",
  "value": ""
 }
]

Etc...

En cas d'éléments simples, j'aurais dû:

[
 {
 "title": "name",
 "value": ""
 }
]

Je recherche une approche générique.

Je sais que je peux utiliser, par exemple, indexOf('results') avec la fonction filter, mais je voudrais s'il est possible d'éviter le code dur car ce ne sont pas toujours les mêmes titres.

Des idées ?

Violon

0
AshBringer 10 mars 2016 à 12:11

3 réponses

Meilleure réponse

Vous pouvez utiliser un objet pour regrouper des éléments similaires:

var groups = {};

parameter_list.forEach(function(p){ 
   var key = p.title.split('_')[0];
   if(!groups[key]) {
      groups[key] = [];
   }
   groups[key].push(p);
});

Démo de travail: http://jsfiddle.net/t459o6v1/3/

2
AndreFeijo 10 mars 2016 à 09:28

Groupez les données avec .reduce()

var groups = data.reduce(function(result, currentValue) {
  var key = currentValue.title.split("_")[0];

  if (typeof result[key] === "undefined") {
    result[key] = [];
  }

  result[key].push(currentValue);

  return result;
}, {});

Et puis (si nécessaire) utilisez {{X0} } pour transformer l'objet en "sous-réseaux"

var subArrays = Object.keys(groups).map(function(key) {
    return groups[key];
});
var data = [{
  "title": "name",
  "value": ""
}, {
  "title": "version",
  "value": ""
}, {
  "title": "inventory_name",
  "value": ""
}, {
  "title": "inventory_version",
  "value": ""
}, {
  "title": "differed",
  "value": ""
}, {
  "title": "differed_name",
  "value": ""
}, {
  "title": "accept_error_while_reboot",
  "value": ""
}, {
  "title": "setup_check",
  "value": ""
}, {
  "title": "setup_install",
  "value": ""
}, {
  "title": "setup_install_partial",
  "value": ""
}, {
  "title": "params_install",
  "value": ""
}, {
  "title": "params_install_partial",
  "value": ""
}, {
  "title": "results_install_ok",
  "value": ""
}, {
  "title": "results_install_reboot_defered",
  "value": ""
}, {
  "title": "results_install_reboot_immediate",
  "value": ""
}, {
  "title": "results_install_partial_ok",
  "value": ""
}, {
  "title": "results_install_partial_reboot_defered",
  "value": ""
}, {
  "title": "results_install_partial_reboot_immediate",
  "value": ""
}];


var groups = data.reduce(function(result, currentValue) {
	var key = currentValue.title.split("_")[0];
  
  if (typeof result[key] === "undefined") {
  	result[key] = [];
  }
  
  result[key].push(currentValue);
  
  return result;
}, {});


var subArrays = Object.keys(groups).map(function(key) {
	return groups[key];
});

console.log(JSON.stringify(subArrays));
1
Andreas 10 mars 2016 à 09:23

J'ai trouvé une solution en utilisant Immutable.JS, mais vous pourriez probablement faire quelque chose de similaire avec lodash ou underscore. Notez qu'il s'agit d'une version fonctionnelle, non impérative.

Créez d'abord une fonction qui obtient le préfixe:

function getPrefix(name) {
    var substr = name.substring(0, name.indexOf('_'))
    return substr ? substr : name;
}

Utilisez ensuite la fonction groupBy:

Immutable.fromJS(arr).groupBy(element => getPrefix( element['title']))
            .toJS();

Cela vous donnera un tableau de tableaux avec le titre comme clé.

1
Luka Jacobowitz 10 mars 2016 à 13:41