2016-08-03 1 views
0

Si je objet avec la structure suivante:concaténer plusieurs valeurs de propriétés d'objet dans un

var test = { 
    property1: "value1", 
    property2: "value2", 
    property3: "value3", 
    property4: "value4", 
    property5: "value5" 
} 

En supposant que les noms de propriété sont fixes et pas toujours dans cet ordre, ce qui est la façon la plus élégante pour convertir cet objet en suivant un:

var test_copy = { 
    prop1Copy: "value1", 
    propConcat: "value2, value3, value4, value5" 
} 
+1

Comment le nom 'prop1Copy' est-il généré? Et, comment savez-vous quelle valeur cela procure-t-il?Rappelez-vous, la plupart du temps les propriétés n'ont pas d'ordre à leur disposition. – jfriend00

+0

prop1Copie est toujours générée par la mise en relation des valeurs de propriété2, propriété3, propriété4 et propriété5 dans cet ordre particulier –

+0

Les propriétés ne leur sont généralement pas adressées. Je demandais comment le nom de propriété prop1Copy est généré? Est-ce juste un nom de propriété câblé? – jfriend00

Répondre

1

Je ne pense pas qu'il y ait une manière particulièrement élégante de faire ceci.

Étant donné que vos données d'entrée a un petit nombre touches fixe il n'y a presque point à l'aide d'une boucle, donc cela fonctionne:

function munge(o) { 
    return { 
     prop1Copy: o.property1, 
     propConcat: [o.property2, o.property3, o.property4, o.property5].join(', ') 
    } 
} 
+0

Merci, c'était exactement ce que je cherchais.Tant que les touches sont fixes et il n'y a pas beaucoup d'entre eux, c'est le plus facile façon de concaténer les valeurs –

+1

En supposant que vous avez seulement 5 propriétés. – Redu

0

Essayez ceci:

function concatObject(object, levels){ 
    var currentLevel = 0; 
    var newObj = {propConcat: ""}; 
    for(var prop in object){ 
     if(currentLevel < levels){ 
      newObj[prop] = object[prop]; 
     } 
     else{ 
      newObj["propConcat"] += object[prop]; 
     } 
    } 
} 

concatObject (test, 1) serait vous donner la réponse, mais il garderait le même nom de propriété pour les variables. Vous avez besoin d'une sorte de fonction de mappage si vous souhaitez modifier les noms de propriété réels (par exemple: de property1 à prop1copy)

Ceci transformer la propriété # à # de propriété copie:

function concatObject(object, levels){ 
    var currentLevel = 0; 
    var newObj = {propConcat: ""}; 
    for(var prop in object){ 
     if(currentLevel < levels){ 
      newObj[prop+"copy"] = object[prop]; 
     } 
     else{ 
      newObj["propConcat"] += object[prop]; 
     } 
    } 
} 
0

Je ne suis pas sûr de ce que vous devez accomplir ici. Mais si vous voulez copier le premier élément et concattez tous les autres, regardez ceci.

function concatValues (obj) { 
    var resObj = {prop1Copy: ""}, count = 0, mergedArr = []; 
    for (var k in obj) { 
     count == 0 ? resObj.prop1Copy = obj[k] : mergedArr.push(obj[k]); 
     count++; 
    } 
    resObj.propConcat = mergedArr.join(", "); 
    return resObj; 
} 

Hope this helps

0

Voici une solution plus générique qui fonctionnerait sur une gamme plus large de l'entrée avec quelques mises en garde.

function concatenateObjectValues(obj) { 
    //If you want the output to be sorted differently, you need to provide your own sort order. This sorts by alphabetical order 
    var keys = Object.keys(test).sort(); 

    //assuming the first property would always be the copy 
    //removing the first element and returning it 
    var copyProp = keys.unshift(); 

    //generate an array that has the values of the remaining properties from the input 
    var concatProp = keys.reduce(function(memo, key) { 
     memo.push(test[key]); 
     return memo; 
    }, []); 

    //create `propConcat` and combine the values using the specified separator 
    var newObj = { 
     propConcat: concatProp.join(", ") 
    }; 

    //add the `prop1Copy` property. The first part of the name would be derived from the actual first property . 
    newObj[copyProp + "Copy"] = obj[copyProp]; 

    return newObj; 
} 
  • En supposant que vous voulez que vos propriétés concaténés dans l'ordre alphabétique, le serait au-dessus de travail. Si ce n'est pas le cas, vous devez spécifier un ordre de tri différent pour . Cela peut être passé en argument, si cela va varier).
  • Si la propriété de copie est susceptible de varier, ce code peut également avoir besoin d'être modifié. Aussi, quelque chose qui peut être passé en tant que paramètre - trivial si c'est juste l'index, mais si vous devez les rechercher par leur nom (par exemple, si vous voulez dire "prop1" indépendamment de l'endroit où il se trouve, vous devez également mettre en œuvre cela).
  • si les noms propConcat et prop1Copy besoin de varier plus que cela, la logique doit être mis en œuvre. Ou les valeurs passées en ...
  • il n'y a pas de validation. Je l'ai gardé simple pour l'exemple, mais un traitement des erreurs serait bon.

Pour être honnête, si votre résultat attendu est va varier de plus d'une chose, par exemple, si vous avez besoin de la propriété copie soit différente et l'ordre de tri pour être différent, alors il pourrait juste Mieux vaut mettre au rebut cette fonction. De grandes variations dans les entrées/sorties attendues rendent le processus un peu compliqué, si vous devez passer la plupart des choses pour construire le résultat.