J'ai besoin de convertir un tableau en objets, puis de déplacer l'une des valeurs de propriété d'objet en tant que nom de clé de propriété d'objet:

[
  {
    "description": "red",
    "type": "fruit",
    "item": "apple"
  },
  {
    "description": "yellow",
    "type":"fruit",
    "item": "banana"
  }
]

Dans

{
  "apple": {
    "description": "red",
    "type": "fruit"
  },
  "banana": {
    "description": "yellow",
    "type": "fruit"
  }
}

En utilisant Object.assign({}, ...arr) remplit les noms des objets en index, j'ai besoin de changer cet index, merci!

0
Johnny Derp 12 avril 2018 à 01:59

6 réponses

Meilleure réponse

Vous pouvez utiliser Array#reduce pour replier votre tableau en un objet. en utilisant la déstructuration, vous pouvez extraire les valeurs de l'objet et créer un nouvel objet dans le format souhaité pour la sortie.

const data = [
  {
    "description": "red",
    "type": "fruit",
    "item": "apple"
  },
  {
    "description": "yellow",
    "type":"fruit",
    "item": "banana"
  }
]

console.log(
  data.reduce((accumulator, { item, description, type }) => ({
    ...accumulator,
    [item]: { description, type }
  }), {})
)
<script src="https://codepen.io/synthet1c/pen/KyQQmL.js"></script>
3
synthet1c 11 avril 2018 à 23:02

D'autres réponses ont très bien couvert la solution JS vanille, mais si vous pouvez utiliser lodash, vous pouvez le faire en combinant les méthodes keyBy, mapValues et omit pour en produire une agréable- doublure:

const myArray = [{
  "description": "red",
  "type": "fruit",
  "item": "apple"
}, {
  "description": "yellow",
  "type": "fruit",
  "item": "banana"
}];

const result = _.mapValues(_.keyBy(myArray, o => o.item), o => _.omit(o, "item"));
console.log(result);
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.5/lodash.min.js"></script>
0
CRice 11 avril 2018 à 23:08

Vous pouvez utiliser la fonction {{ X0}} pour créer la sortie souhaitée.

var array = [  {    "description": "red",    "type": "fruit",    "item": "apple"  },  {    "description": "yellow",    "type":"fruit",    "item": "banana"  }],
    result = array.reduce((a, {description, type, item}) => (Object.assign(a, {[item]: {description, type}})), {});

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
<script src="https://codepen.io/synthet1c/pen/KyQQmL.js"></script>

Sans lien: Joli plugin de console de @ synthet1c

2
Ele 11 avril 2018 à 23:19

Vous pouvez utiliser réduire

let arr=[
  {
    "description": "red",
    "type": "fruit",
    "item": "apple"
  },
  {
    "description": "yellow",
    "type":"fruit",
    "item": "banana"
  }
]
const convert_to_object = (myarray) =>
   myarray.reduce((o, i) => {
     o[i.item] = {description:i.description,type:i.type}
     return o
   }, {})
const peopleObject = convert_to_object(arr)
console.log(peopleObject)
0
sumit 11 avril 2018 à 23:10

Une façon consiste à utiliser un forEach sur le tableau et à créer un objet basé sur les propriétés:

var arr = [{"description": "red", "type": "fruit", "item": "apple"},{"description":"yellow","type":"fruit","item": "banana"}]

obj = {};
arr.forEach((o) => {
    obj[o.item] = o;
    delete o.item;
});

console.log(obj)
0
Spencer Wieczorek 11 avril 2018 à 23:05

Peut être fait avec un seul appel à reduce.

const data = [{
    "description": "red",
    "type": "fruit",
    "item": "apple"
  },
  {
    "description": "yellow",
    "type": "fruit",
    "item": "banana"
  }
]

const regrouped = data.reduce((acc, {
  description,
  type,
  item
}) => {
  acc[item] = {
    description,
    type
  }
  return acc
}, {});

console.log(regrouped)
0
mpen 11 avril 2018 à 23:03