2016-09-07 2 views
2

S'il vous plaît jeter un oeil sur le bloc de code ci-dessous:Une meilleure façon de faire une boucle dans une collection (struct) en CFML?

<cfset index = 0 /> 
<cfloop collection="#anotherPerson#" item="key" > 
    <cfset index = index+1 /> 
    <cfoutput> 
     #key# : #anotherPerson[key]# 
     <cfif index lt ArrayLen(structKeyArray(anotherPerson))> , </cfif> 
    </cfoutput> 
</cfloop> 

<!--- Result 

    age : 24 , haar : Blondes haar , sex : female , ort : Hanau 

----> 

Maintenant, pouvez-vous s'il vous plaît me dire comment pourrais-je obtenir le même résultat sans créer un index extérieur et incrémenter dans la boucle? Si vous remarquez attentivement, j'ai dû écrire deux autres cfset tag et un cfif tag avec code coûteux juste pour éviter une virgule (,) à la fin de la collection!

+1

Serait-il correct de dire que vous voulez sortir chaque clé dans la structure suivie de la valeur de cette clé et délimiter chaque paire k/v avec une virgule? Malheureusement, votre utilisation de CF9 va vraiment limiter ce que vous pouvez faire. –

+0

Est-ce que d'autres versions de CF ont de meilleures façons de le faire? – edam

+1

D'autres versions de ColdFusion pourraient avoir de meilleures façons de faire les choses, mais le facteur le plus important concernant la version que vous utilisez, est la version utilisée partout où vous prévoyez de mettre en production. –

Répondre

2

Certains amis ont fourni deux solutions différentes. Les deux sont efficaces et élégants!

Solution 1

<cfset isFirst = true /> 
<cfloop collection="#anotherPerson#" item="key" > 
    <cfif isFirst> 
     <cfset isFirst = false /> 
    <cfelse> 
     , 
    </cfif> 
    <cfoutput> 
     #key# : #anotherPerson[key]# 
    </cfoutput> 
</cfloop> 

Solution 2

<cfset resultList = "" /> 
<cfloop collection="#anotherPerson#" item="key" > 
    <cfset resultList = ListAppend(resultList, "#key# : #anotherPerson[key]#") /> 
</cfloop> 

Cheers!

+0

La solution 1 me fait rire. – Fergus

7

Ok, je vous montre deux réponses. Le premier fonctionnera sur ColdFusion 9. Comme d'autres personnes pourraient trouver ce sujet et utiliser Lucee Server ou une version plus récente d'Adobe ColdFusion, j'inclus un one-liner qui utilise des fonctions d'ordre supérieur et fonctionne sur ACF 2016. Il y a beaucoup du sucre syntaxique (comme les fonctions membres) et de la programmation fonctionnelle qui vous manquent en étant sur CF9. Ces réponses utilisent un script, car la manipulation de données n'est pas quelque chose pour une vue (où tags/templates sont utilisés).

Configurer les données

myStruct = { 'age'=24, 'haar'='Blondes haar', 'sex'='female', 'ort'='Hanau' }; 

CF9 COMPAT, convertir des données en tableau et utiliser delimiter ajouter des virgules

myArray = []; 
for(key in myStruct) { 
    arrayAppend(myArray, key & ' : ' & myStruct[ key ]); 
} 
writeOutput(arrayToList(myArray, ', ')); 

moderne CFML. Utilisez la réduction de structure pour convertir chaque clé en un tableau agrégé qui est ensuite transformé en liste.

writeOutput(myStruct.reduce(function(r,k,v,s){ return r.append(k & ' : ' & s[ k ]); }, []).toList(', ')); 

http://cfdocs.org/structreduce

+0

CFML moderne est souvent plus lent, au moins dans Adobe CF (pas sûr de Lucee) – Henry

+1

Pour ne pas mentionner si je voyais ce code, je le supprimer et le rendre lisible. – Leeish

+0

L'OP était préoccupé par les lignes de code utilisées. (Pas quelque chose dont je m'inquiéterais personnellement, mais peu importe). Si vous êtes plus inquiet au sujet de la lisibilité (une quête noble), alors l'exemple "Modern CFML" peut facilement avoir des espaces et des noms de variables plus longs. Il serait lisible par quiconque connaissant les fonctions de réduction d'ordre supérieur. –

0

garniture Juste la virgule lorsque vous avez terminé, aucune logique de saut nécessaire.

<cfset html = '' /> 
<cfloop collection="#anotherPerson#" item="key" > 
    <cfset html &= "#key# : #anotherPerson[key]# , " /> 
</cfloop> 
<cfset html = left(html,len(html)-3) /> 

<cfoutput>#html#</cfoutput> 

Lecture, simple, fonctionne. Pouvez-vous clarifier l'objectif global du code?

+0

Oui, cela fonctionne dans la plupart des cas. Bien que listAppend soit un peu plus simple, et fonctionne même si la structure est vide. – Leigh

+0

Donc vous dites 'listAppend (html," key ":" anotherPerson [clé] # ")' – Leeish

+1

Oui. Quelque chose comme ça est ce qu'ils ont fini par utiliser. – Leigh