-1
votes

Regrouper les articles dans un tableau

J'ai besoin d'aide sur la manière de transformer un tableau avec plusieurs objets dans lesquels je souhaite regrouper certains des types dans un seul objet. Spécifiquement ceux avec type "h *" et "texte". Jusqu'à présent, j'ai cette fonction xxx pré>

Cela me donne une liste de tous les éléments maintenant avec les champs de type et de contenu. Je veux les regrouper maintenant sans interrompre la commande dans la liste. Je suis à mi-chemin de ce que je peux dire et maintenant je suis coincé. P>

plus, il y a probablement une méthode plus facile que j'ai utilisée ici. p>

Voici un exemple de tableau initial: p>

{"contentAfter": [
    {
        "type": "text-block",
        "content": "<h2>Header 2</h2><p>Some Text <a href=\"https://let/me/out\">and</a> then some</p><p>Some more text</p>"
    },
    {
        "type": "list-simple",
        "content": {
            "header": "Qs",
            "html": "<ul><li>Q1</li><li>Q2</li><li>Q3</li><li>Q4</li><li>Q5</li></ul>"
        }
    },
    {
        "type": "image-block",
        "content": {
            "url": "qs.png",
            "altText": "qs",
            "seoImportant": true,
            "imgSrc": "",
            "imgEmbedded": false,
            "articleID": "artcile1234",
            "height": 700,
            "width": 1200
        }
    },
    {
        "type": "text-block",
        "content": "<p>Somebody</p><p>I used to know</p><h3>Header 3</h3><p>More text</p><ol><li>1</li><li><a href=\"https://hear.com/me/out\">2</a></li><li>3</li></ol>"
    },
    {
        "type": "list-simple",
        "content": {
            "header": "1. Q1?",
            "html": "<p><em>Big 1</em></p>"
        }
    },
    {
        "type": "list-simple",
        "content": {
            "header": "2. Q2?",
            "html": "<p><em>Big 2</em></p>"
        }
    },
    {
        "type": "text-block",
        "content": "<h3>Header 3</h3><p>More text?</p>"
    },
    {
        "type": "list-pos",
        "content": {
            "header": "Qq:",
            "html": "<ul><li><em>1</em></li><li><em>2</em></li></ul>"
        }
    },
    {
        "type": "text-block",
        "content": "<p>Even more text</p>"
    }
]}


4 commentaires

Qu'est-ce que vous voulez dire avec "regrouper" ?


Veuillez cliquer sur Modifier puis [<>] pour créer un Exemple reproductibleminimal


1er, on dirait que vous faites la même chose pour toutes les personnes sauf le type image . 2e, je pense que continuer; ou pause; au lieu de retour; pourrait mieux répondre à votre usecase, difficile à dire. Ok, alors votre problème est-il quoi maintenant?


@Ninascholz "regroupement" n'était probablement pas la meilleure description. Je voulais recueillir des objets avec des types H2, H3 et un texte qui sont à côté du même type et les combinent en un sans gâcher l'ordre des autres éléments du tableau


3 Réponses :


1
votes

Je ne suis pas sûr de comprendre ce que vous essayez de faire, mais voici un script qui reproduit les pièces que j'ai pu remarquer et me semble créer la sortie que vous donnez comme exemple de sortie pour l'entrée donnée:

p>

const content = {"contentBefore": [
    {
        "type": "H2",
        "html": "<h2>Header 2</h2>"
    },
    {
        "type": "text",
        "html": "<p>Some Text <a href=\"https://let/me/out\">and</a> then some</p>"
    },
    {
        "type": "text",
        "html": "<p>Some more text</p>"
    },
    {
        "type": "list-simple",
        "simple": {
            "header": "Qs",
            "html": "<ul><li>Q1</li><li>Q2</li><li>Q3</li><li>Q4</li><li>Q5</li></ul>"
        }
    },
    {
        "type": "image",
        "content": {
            "url": "qs.png",
            "altText": "qs",
            "seoImportant": true,
            "imgSrc": "",
            "imgEmbedded": false,
            "articleID": "artcile1234",
            "height": 700,
            "width": 1200
        }
    },
    {
        "type": "text",
        "html": "<p>Somebody</p>"
    },
    {
        "type": "text",
        "html": "<p>I used to know</p>"
    },
    {
        "type": "H3",
        "html": "<h3>Header 3</h3>"
    },
    {
        "type": "text",
        "html": "<p>More text</p>"
    },
    {
        "type": "text",
        "html": "<ol><li>1</li><li><a href=\"https://hear.com/me/out\">2</a></li><li>3</li></ol>"
    },
    {
        "type": "list-simple",
        "simple": {
            "header": "1. Q1?",
            "html": "<p><em>Big 1</em></p>"
        }
    },
    {
        "type": "list-simple",
        "simple": {
            "header": "2. Q2?",
            "html": "<p><em>Big 2</em></p>"
        }
    },
    {
        "type": "H3",
        "html": "<h3>Header 3</h3>"
    },
    {
        "type": "text",
        "html": "<p>More text?</p>"
    },
    {
        "type": "list-pos",
        "pos": {
            "header": "Qq:",
            "html": "<ul><li><em>1</em></li><li><em>2</em></li></ul>"
        }
    },
    {
        "type": "text",
        "html": "<p>Even more text</p>"
    }
]};

const getType = function(item) {
  if (/^H/.test(item.type) || item.type == "text") return "text-block";
  if (item.type == "image") return "image-block";
  // Looks like you may have more logic for this; not going to try to reproduce it
  return item.type;
}

let currentTextBlock = null;

content.contentAfter = content.contentBefore.reduce(function(result,item) {
   const type = getType(item);
   if (type == "text-block") {
     if (currentTextBlock) {
       currentTextBlock.content += item.html;
     } else {
       currentTextBlock = { type: "text-block", content: item.html };
       result.push(currentTextBlock);
     }
   } else {
     currentTextBlock = null;
     result.push(Object.assign({}, item, { type: type }));
   }
   return result;
}, []);


console.log(JSON.stringify(content,void(0),"  "))


1 commentaires

Oui, c'était exactement ça. Pardon pour une description vague. Merci



0
votes

Vous pouvez regrouper par tout le texte et stocker la dernière partie de texte pour une utilisation ultérieure.

p>

.as-console-wrapper { max-height: 100% !important; top: 0; }


0 commentaires

0
votes

Vous pouvez grouper comme ceci. J'espère que cela résoudra votre problème.

var data = [ { "type": "H2", "html": "<h2>Header 2</h2>" }, { "type": "text", "html": "<p>Some Text <a href=\"https://let/me/out\">and</a> then some</p>" }, { "type": "text", "html": "<p>Some more text</p>" }, { "type": "list-simple", "simple": { "header": "Qs", "html": "<ul><li>Q1</li><li>Q2</li><li>Q3</li><li>Q4</li><li>Q5</li></ul>" } }, { "type": "image", "content": { "url": "qs.png", "altText": "qs", "seoImportant": true, "imgSrc": "", "imgEmbedded": false, "articleID": "artcile1234", "height": 700, "width": 1200 } }, { "type": "text", "html": "<p>Somebody</p>" }, { "type": "text", "html": "<p>I used to know</p>" }, { "type": "H3", "html": "<h3>Header 3</h3>" }, { "type": "text", "html": "<p>More text</p>" }, { "type": "text", "html": "<ol><li>1</li><li><a href=\"https://hear.com/me/out\">2</a></li><li>3</li></ol>" }, { "type": "list-simple", "simple": { "header": "1. Q1?", "html": "<p><em>Big 1</em></p>" } }, { "type": "list-simple", "simple": { "header": "2. Q2?", "html": "<p><em>Big 2</em></p>" } }, { "type": "H3", "html": "<h3>Header 3</h3>" }, { "type": "text", "html": "<p>More text?</p>" }, { "type": "list-pos", "pos": { "header": "Qq:", "html": "<ul><li><em>1</em></li><li><em>2</em></li></ul>" } }, { "type": "text", "html": "<p>Even more text</p>" } ];


data.reduce(function(acc,val){
    if(acc[val["type"]]){
        acc[val["type"]].push(val);
    } else {
        acc[val["type"]] = [val];
    }
return acc;
},{});


0 commentaires