Maison  >  Questions et réponses  >  le corps du texte

Réécrivez le titre comme suit : Regroupez le tableau principal et ajoutez des champs et des sous-tableaux dans chaque groupe.

<p>J'ai un tableau lourd comme celui-ci : </p> <pre class="brush:php;toolbar:false;">[ {Id : 1, Nom : "Rouge", nom de l'option : "Couleur"}, {Id : 2, Nom : 'Jaune', nom de l'option : 'Couleur'}, {Id : 3, Nom : "Bleu", nom de l'option : "Couleur"}, {Id : 4, Nom : "Vert", nom de l'option : "Couleur"}, {Id : 7, Nom : "Noir", nom de l'option : "Couleur"}, {Id : 8, Nom : 'S', nom de l'option : 'Taille'}, {Id : 11, Nom : 'M', nom de l'option : 'Taille'}, {Id : 12, Nom : 'L', nom de l'option : 'Taille'}, {Id : 13, Nom : 'XL', nom de l'option : 'Taille'}, {Id : 14, Nom : 'XXL', nom de l'option : 'Taille'} ]≪/pré> <p>Je dois regrouper par <code>optionName</code> et avoir deux lignes dans le tableau principal, comme ceci : </p> <pre class="brush:php;toolbar:false;">[ { Nom : « Couleur », Données :[{Id : 1, Nom : 'Rouge'}, {Id : 2, Nom : 'Jaune'}, {Id : 3, Nom : 'Bleu'}, {Id : 4, Nom : 'Vert'}, {Id : 7, Nom : 'Noir'}] }, { Nom : 'Taille', Données :[{Id : 8, Nom : 'S'}, {Id : 11, Nom : 'M'}, {Id : 12, Nom : 'L'}, {Id : 13, Nom : 'XL'}, {Id : 14, Nom : 'XXL'}] } ]≪/pré> <p>Comment l'implémenter en javascript ? </p>
P粉190443691P粉190443691422 Il y a quelques jours380

répondre à tous(2)je répondrai

  • P粉409742142

    P粉4097421422023-08-25 18:44:16

    Une solution ES6 utilisant l'objet Map :

    function groupBy(arr, key) {
      	return arr.reduce(
          (sum, item) => {
          	const groupByVal = item[key];
            groupedItems = sum.get(groupByVal) || [];
            groupedItems.push(item);
          	return sum.set(groupByVal, groupedItems);
            },
          new Map()
          );
    }
    
    var Data = [ 
    { Id: 1, Name: 'Red', optionName: 'Color' }, 
      { Id: 2, Name: 'Yellow', optionName: 'Color' },
      { Id: 3, Name: 'Blue', optionName: 'Color' },
      { Id: 4, Name: 'Green', optionName: 'Color' },
      { Id: 7, Name: 'Black', optionName: 'Color' },
      { Id: 8, Name: 'S', optionName: 'Size' },
      { Id: 11, Name: 'M', optionName: 'Size' },
      { Id: 12, Name: 'L', optionName: 'Size' },
      { Id: 13, Name: 'XL', optionName: 'Size' },
      { Id: 14, Name: 'XXL', optionName: 'Size' } ];
    
    document.getElementById("showArray").innerHTML =JSON.stringify([...groupBy(Data, 'optionName')], null, 4); 
    <pre id="showArray"></pre>

    répondre
    0
  • P粉298305266

    P粉2983052662023-08-25 15:50:49

    Voici l'extrait de code que j'ai écrit pour cette situation. Vous pouvez ajouter cette fonction à tous les tableaux :

    Object.defineProperty(Array.prototype, 'group', {
      enumerable: false,
      value: function (key) {
        var map = {};
        this.forEach(function (e) {
          var k = key(e);
          map[k] = map[k] || [];
          map[k].push(e);
        });
        return Object.keys(map).map(function (k) {
          return {key: k, data: map[k]};
        });
      }
    });

    Vous pouvez l'utiliser comme ça. Vous transmettez simplement une fonction qui définit comment regrouper les données.

    var newArray = arr.group(function (item) {
      return item.optionName;
    });

    Violon de travail

    Vous pouvez {key: k, data: map[k]}替换为{Name: k, Data: map[k]} si besoin.


    Il s'agit également d'une version ES6 plus compacte du code ci-dessus :

    Object.defineProperty(Array.prototype, 'group', {
      enumerable: false,
      value: function (key) {
        let map = {};
        this.map(e => ({k: key(e), d: e})).forEach(e => {
          map[e.k] = map[e.k] || [];
          map[e.k].push(e.d);
        });
        return Object.keys(map).map(k => ({key: k, data: map[k]}));
      }
    });

    Utilisez-le comme ceci :

    let newArray = arr.group(item => item.optionName))

    répondre
    0
  • Annulerrépondre