4
votes

combinaison de valeurs clés dans un objet d'un tableau

Je cherche à combiner toutes les valeurs clés dans les objets de ce tableau.

[
  ['Brunello Cucinelli, tasselled black low-top lace-up, 1000'],
  ['Brunello Cucinelli, tasselled green low-top lace-up, 1100'],
...
]

le résultat final devrait être:

function renderInventory(inventory) {
  const arr = [];
  for (var i = 0; i < inventory.length; i++) {
    for (var n = 0; n < inventory[i].shoes.length; n++) {
      arr.push([inventory[i].name + ', ' + inventory[i].shoes[n].name + ', ' + inventory[i].shoes[n].price]);
    }
  }
  return arr;
}

J'ai le code suivant:

[
  ['Brunello Cucinelli', 'tasselled black low-top lace-up', 1000],
  ['Brunello Cucinelli', 'tasselled green low-top lace-up', 1100],
  // ...
]

et cela me donne le résultat de:

var currentInventory = [
  {
    name: 'Brunello Cucinelli',
    shoes: [
      {name: 'tasselled black low-top lace-up', price: 1000},
      {name: 'tasselled green low-top lace-up', price: 1100},
      {name: 'plain beige suede moccasin', price: 950},
      {name: 'plain olive suede moccasin', price: 1050}
    ]
  },
  {
    name: 'Gucci',
    shoes: [
      {name: 'red leather laced sneakers', price: 800},
      {name: 'black leather laced sneakers', price: 900}
    ]
  }
];

Je ne suis pas sûr de ce qu'il faut faire pour que les citations s'enroulent autour de chaque élément plutôt que sur l'ensemble du tableau.


0 commentaires

4 Réponses :


3
votes

Vous pouvez utiliser flatMap pour prendre chaque objet extérieur et extraire le name et le tableau shoes mappé de chacun:

p>

<script src="https://polyfill.io/v3/polyfill.min.js?features=default%2CArray.prototype.flatMap"></script>
var currentInventory = [
  {
    name: 'Brunello Cucinelli',
    shoes: [
      {name: 'tasselled black low-top lace-up', price: 1000},
      {name: 'tasselled green low-top lace-up', price: 1100},
      {name: 'plain beige suede moccasin', price: 950},
      {name: 'plain olive suede moccasin', price: 1050}
    ]
  },
  {
    name: 'Gucci',
    shoes: [
      {name: 'red leather laced sneakers', price: 800},
      {name: 'black leather laced sneakers', price: 900}
    ]
  }
];
const output = currentInventory.flatMap(
  ({ name, shoes }) => shoes.map(
    shoe => [name, shoe.name, shoe.price]
  )
);
console.log(output);


2 commentaires

flatmap n'est pas un standard, en fait.


La proposition est terminée - elle fera partie du langage, et elle est actuellement implémentée dans les versions modernes de Chrome, FF, Opera et Safari - je pense que ça va. Comme toujours, on peut utiliser Babel et polyfills pour conserver la compatibilité avec les navigateurs obsolètes (l'extrait fonctionne sur IE :))



3
votes

Vous devez renvoyer uniquement un tableau avec des éléments, pas une chaîne jointe.

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

function renderInventory(inventory) {
    return inventory.reduce((r, { name: item, shoes }) => [
        ...r,
        ...shoes.map(({ name, price }) => [item, name, price])
    ], []);
}

var currentInventory = [{ name: 'Brunello Cucinelli', shoes: [{ name: 'tasselled black low-top lace-up', price: 1000 }, { name: 'tasselled green low-top lace-up', price: 1100 }, { name: 'plain beige suede moccasin', price: 950 }, { name: 'plain olive suede moccasin', price: 1050 }] }, { name: 'Gucci', shoes: [{ name: 'red leather laced sneakers', price: 800 }, { name: 'black leather laced sneakers', price: 900 }] }];

console.log(renderInventory(currentInventory));
.as-console-wrapper { max-height: 100% !important; top: 0; }

Une approche plus courte en prenant les valeurs déstructurées.

function renderInventory(inventory) {
  const arr = [];
  for (var i = 0; i < inventory.length; i++) {
    for (var n = 0; n < inventory[i].shoes.length; n++) {
      arr.push([inventory[i].name, inventory[i].shoes[n].name,  inventory[i].shoes[n].price]);
    }
  }
  return arr;
}

var currentInventory = [{ name: 'Brunello Cucinelli', shoes: [{ name: 'tasselled black low-top lace-up', price: 1000 }, { name: 'tasselled green low-top lace-up', price: 1100 }, { name: 'plain beige suede moccasin', price: 950 }, { name: 'plain olive suede moccasin', price: 1050 }] }, { name: 'Gucci', shoes: [{ name: 'red leather laced sneakers', price: 800 }, { name: 'black leather laced sneakers', price: 900 }] }];

console.log(renderInventory(currentInventory));
arr.push([inventory[i].name, inventory[i].shoes[n].name,  inventory[i].shoes[n].price]);


0 commentaires

0
votes

Array.prototype.reduce () , Array.prototype.map () et Array.prototype .concat () :

.as-console-wrapper { max-height: 100% !important; top: 0; }
const currentInventory = [{name: 'Brunello Cucinelli',shoes: [{name: 'tasselled black low-top lace-up', price: 1000},{name: 'tasselled green low-top lace-up', price: 1100},{name: 'plain beige suede moccasin', price: 950},{name: 'plain olive suede moccasin', price: 1050}]},{name: 'Gucci',shoes: [{name: 'red leather laced sneakers', price: 800},{name: 'black leather laced sneakers', price: 900}]}];
const result = currentInventory.reduce((a, c) => [].concat(a, c.shoes.map(s => ([c.name, s.name, s.price]))), [])

console.log(result);


0 commentaires

0
votes

Vous devez d'abord collecter des chaussures de sous-gamme et les aplatir. puis utilisez la fonction map pour structurer comme vous le souhaitez.

Voici le code

const result = currentInventory
  .reduce((flat, { shoes }) => {
    flat.push(shoes);
    return flat;
  }, [])
  .flat()
  .map(({ name, price }) => [name, price]);

version plus courte

const currentInventory = [
  {
    name: "Brunello Cucinelli",
    shoes: [
      { name: "tasselled black low-top lace-up", price: 1000 },
      { name: "tasselled green low-top lace-up", price: 1100 },
      { name: "plain beige suede moccasin", price: 950 },
      { name: "plain olive suede moccasin", price: 1050 }
    ]
  },
  {
    name: "Gucci",
    shoes: [
      { name: "red leather laced sneakers", price: 800 },
      { name: "black leather laced sneakers", price: 900 }
    ]
  }
];

const flatten = currentInventory
  .reduce((flat, inventory) => {
    flat.push(inventory.shoes);
    return flat;
  }, [])
  .flat();

const result = flatten.map(({ name, price }) => {
  return [name, price];
});

console.log(result);


0 commentaires