2017-10-03 2 views
0

Je tente de modifier un tableau d'objets avec lodash, et de lutter un peu. Je voudrais prendre le tableau ci-dessous et changer les clés dans les objets.Modifier des clés dans un tableau avec Lodash

Voici mon tableau source:

[ 
    { 
     "id": "AD", 
     "name": "Andorra", 
     "currency": "EUR", 
     "timezone": "Europe/Andorra", 
     "links": [ 
      { 
       "rel": "self", 
       "href": "http://localhost:8000/api/countries/AD" 
      }, 
      { 
       "rel": "country.currency", 
       "href": "http://localhost:8000/api/currencies/EUR" 
      } 
     ] 
    }, 
    { 
     "id": "AE", 
     "name": "United Arab Emirates", 
     "currency": "AED", 
     "timezone": "Asia/Dubai", 
     "links": [ 
      { 
       "rel": "self", 
       "href": "http://localhost:8000/api/countries/AE" 
      }, 
      { 
       "rel": "country.currency", 
       "href": "http://localhost:8000/api/currencies/AED" 
      } 
     ] 
    }, 
    ... 
    ] 

Je voudrais que cela se traduise par:

[ 
    { 
     "value": "AD", 
     "title": "Andorra", 
     "currency": "EUR", 
     "timezone": "Europe/Andorra", 
     "links": [ 
      { 
       "rel": "self", 
       "href": "http://localhost:8000/api/countries/AD" 
      }, 
      { 
       "rel": "country.currency", 
       "href": "http://localhost:8000/api/currencies/EUR" 
      } 
     ] 
    }, 
    { 
     "value": "AE", 
     "title": "United Arab Emirates", 
     "currency": "AED", 
     "timezone": "Asia/Dubai", 
     "links": [ 
      { 
       "rel": "self", 
       "href": "http://localhost:8000/api/countries/AE" 
      }, 
      { 
       "rel": "country.currency", 
       "href": "http://localhost:8000/api/currencies/AED" 
      } 
     ] 
    }, 
    ... 
    ] 

Notez que les deux premières touches sont rebaptisés. Je sais que je peux utiliser _.mapKeys pour modifier les clés, mais je ne suis pas sûr de comment itérer le tableau de la meilleure façon de le faire.

Toutes les suggestions seraient grandement appréciées.

+0

Itérer avec '' map' et exécuter mapKeys' à chaque itération? – Dominik

+0

excellentes suggestions, merci à tous – zag2010

Répondre

2

Je préfère ne pas modifier les données d'origine si ce que je ferais:

const thing = [{id:"AD",name:"Andorra",currency:"EUR",timezone:"Europe/Andorra",links:[{rel:"self",href:"http://localhost:8000/api/countries/AD"},{rel:"country.currency",href:"http://localhost:8000/api/currencies/EUR"}]},{id:"AE",name:"United Arab Emirates",currency:"AED",timezone:"Asia/Dubai",links:[{rel:"self",href:"http://localhost:8000/api/countries/AE"},{rel:"country.currency",href:"http://localhost:8000/api/currencies/AED"}]}]; 

const newThing = []; 

thing.map(item => { 
    newThing.push(
     _.mapKeys(item, (value, key) => { 
      let newKey = key; 
      if(key === 'id') { 
       newKey = 'value'; 
      } 

      if(key === 'name') { 
       newKey = 'title'; 
      } 

      return newKey; 
     }) 
    ) 
}); 

console.log(newThing); 
1

Itérer utilisant Array#map (ou de _.map() lodash), et utiliser Object#assign (ou _.assign()) pour générer un nouvel objet avec la clé du changement. Assign fusionne un objet avec de nouvelles clés avec les valeurs respectives de l'objet d'origine et l'objet d'origine sans les clés que vous souhaitez remplacer en utilisant _.omit().

var data = [{"id":"AD","name":"Andorra","currency":"EUR","timezone":"Europe/Andorra","links":[{"rel":"self","href":"http://localhost:8000/api/countries/AD"},{"rel":"country.currency","href":"http://localhost:8000/api/currencies/EUR"}]},{"id":"AE","name":"United Arab Emirates","currency":"AED","timezone":"Asia/Dubai","links":[{"rel":"self","href":"http://localhost:8000/api/countries/AE"},{"rel":"country.currency","href":"http://localhost:8000/api/currencies/AED"}]}]; 
 

 
var result = data.map(function(o) { 
 
    return Object.assign({ 
 
    value: o.id, 
 
    title: o.name 
 
    }, _.omit(o, 'id', 'name')); 
 
}); 
 

 
console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>

1

Vous pouvez utiliser _.map et créer un nouvel objet, modifier les touches en fonction de la condition et retourner le nouvel objet.

var obj = [{ 
 
    "id": "AD", 
 
    "name": "Andorra", 
 
    "currency": "EUR", 
 
    "timezone": "Europe/Andorra", 
 
    "links": [{ 
 
    "rel": "self", 
 
    "href": "http://localhost:8000/api/countries/AD" 
 
    }, { 
 
    "rel": "country.currency", 
 
    "href": "http://localhost:8000/api/currencies/EUR" 
 
    }] 
 
}, { 
 
    "id": "AE", 
 
    "name": "United Arab Emirates", 
 
    "currency": "AED", 
 
    "timezone": "Asia/Dubai", 
 
    "links": [{ 
 
    "rel": "self", 
 
    "href": "http://localhost:8000/api/countries/AE" 
 
    }, { 
 
    "rel": "country.currency", 
 
    "href": "http://localhost:8000/api/currencies/AED" 
 
    }] 
 
}]; 
 

 
var updatedObj = _.map(obj, function(currObj, index) { 
 
    var newObj = {}; 
 
    
 
    Object.keys(currObj).forEach(function(key) { 
 
     if(key === 'id') { 
 
    \t  newObj.value = currObj[key]; 
 
    \t } else if(key === 'name') { 
 
      newObj.name = currObj[key]; 
 
     } else { 
 
      newObj[key] = currObj[key]; 
 
     } 
 
    }); 
 
    return newObj; 
 
}); 
 

 
console.log(updatedObj);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>