J'ai un tableau d'objets et je souhaite créer un autre objet en fonction de leurs clés. Par exemple, j'ai un tableau comme
var i = 1, new_arr = {}; _.reduce(arr, function(key, val){ new_arr[i++] = temp1.key return new_arr; },{})
et je veux mon tableau de résultats comme
var result = {1:[36011,19754,15711], 2:[18320,6722,10039],..}
On m'a suggéré d'utiliser lodash, je suis nouveau à ceci donc j'ai essayé d'utiliser la réduction
var arr = [{1: 36011, 2: 18320, 3: 36011, 4: 10570}, {1: 19754, 2: 6722, 3: 19754, 4: 6699}, {1: 15711, 2: 10039, 3: 15711, 4: 4172}]
J'obtiens les valeurs comme indéfinies . Quelle est l'erreur, quelqu'un peut-il m'aider?
4 Réponses :
Cela peut sembler intimidant au premier abord. Commencez à réduire l'ensemble de données à partir d'un objet vide. Ensuite, réduisez chaque ligne en commençant par le résultat de la réduction externe et tirez parti du résultat jusqu'à présent.
const addToBucket = (bucket = {}, k, v, prev = bucket[k] || []) => ({ ...bucket, [k]: [...prev, v], }) const toBucket = list => list.reduce( (bucket, row) => Object.entries(row).reduce((b, [k, v]) => addToBucket(b, k, v), bucket), {}, ) const data = [ { 1: 36011, 2: 18320, 3: 36011, 4: 10570 }, { 1: 19754, 2: 6722, 3: 19754, 4: 6699 }, { 1: 15711, 2: 10039, 3: 15711, 4: 4172 }, ] console.log(toBucket(data)) // Nested list, as requested console.log(Object.entries(toBucket(data)).map(([_, v]) => v))
Merci! Cela a été vraiment utile et j'ai appris un nouveau morceau de code aujourd'hui! @kornieff
Heureux d'avoir pu aider. Si mon code fait toujours peur, lisez simplement les fonctionnalités de déconstruction et de diffusion d'ES6. Bienvenue en 2020 🥳!
Si je veux créer le tout dans un tableau, pas un objet, comment dois-je le changer? @kornieff
Pouvez-vous me donner un exemple de ce à quoi vous voulez que cela ressemble?
J'ai ajouté une image à ma question. vérifiez-le @kornieff
Vous pouvez essayer comme ça de la manière la plus simple.
Ceci est également disponible en ligne à l'adresse https://rextester.com/IPI35964 pour essayer de voir la sortie.
{ '1': [ 36011, 19754, 15711 ], '2': [ 18320, 6722, 10039 ], '3': [ 36011, 19754, 15711 ], '4': [ 10570, 6699, 4172 ] }
Sortie
var arr = [{1: 36011, 2: 18320, 3: 36011, 4: 10570}, {1: 19754, 2: 6722, 3: 19754, 4: 6699}, {1: 15711, 2: 10039, 3: 15711, 4: 4172}] var output = {} for(var obj of arr){ for(var key in obj){ if(key in output){ output[key].push(obj[key]) } else { output [key] = [obj[key]] } } } console.log(output)
Une façon assez simple de faire cela:
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.min.js"></script>
var arr = [ { 1: 36011, 2: 18320, 3: 36011, 4: 10570 }, { 1: 19754, 2: 6722, 3: 19754, 4: 6699 }, { 1: 15711, 2: 10039, 3: 15711, 4: 4172 } ]; // Get one big array of all key-value pairs var pairs = _.flatMap(arr, _.entries); // Group by the keys (index 0 of the pairs) var groups = _.groupBy(pairs, 0); // Extract the values var final = _.mapValues(groups, _.partial(_.map, _, 1)); //console.log(pairs); console.log(final); // Using chaining: var final2 = _.chain(arr) .flatMap(_.entries) .groupBy(0) .mapValues(_.partial(_.map, _, 1)); console.log(final2);
avec lodash, vous pouvez utiliser _.mergeWith ()
et concater les valeurs dans la fonction de personnalisation:
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.js"></script>
const arr = [{"1":36011,"2":18320,"3":36011,"4":10570},{"1":19754,"2":6722,"3":19754,"4":6699},{"1":15711,"2":10039,"3":15711,"4":4172}] const result = _.mergeWith({}, ...arr, (ov = [], sv) => ov.concat(sv)) console.log(result)
Il n'y a pas besoin de lodash, réduire est largement pris en charge. Nous sommes presque 2020! Le
i
dans votre code est global, donc il comptera toutes les valeurs. La réduction de votre code ne peut pas avoir de paire clé / valeur puisque vous l'appliquez à un tableau.Aucune des questions indiquées dans "fermer comme double" ne contenait de réponse à cette question. Les deux concernaient le regroupement sur une seule propriété spécifique, alors qu'il s'agissait de fusionner plusieurs objets sur des propriétés arbitraires.