J'ai un Array
comme celui-ci
[ { name: "A", job: ["1"] }, { name: "A", job: ["2"] }, { name: "B", job: ["2"] }, { name: "C", job: [] } ]
Comment l'aplatir en quelque chose comme ça en utilisant lodash.
[ { name: "A", job: ["1", "2"] }, { name: "B", job: ["2"] }, { name: "C", job: [] } ]
3 Réponses :
let arr = [{ name: "A", job: ["1", "2"] }, { name: "B", job: ["2"] }, { name: "C", job: [] } ]; let newArr = []; for (i = 0; i < arr.length; i++) { var job = arr[i].job if (job.length > 0) { for (j = 0; j < job.length; j++) { obj = {}; obj.name = arr[i].name; obj.job = [job[j]]; newArr.push(obj); } } else { obj = {}; obj.name = arr[i].name; obj.job = []; newArr.push(obj); } } console.log(newArr);
Merci. C'est ainsi que j'avais mis en œuvre plus tôt.
Vous n'avez pas besoin d'utiliser la récursivité si votre objet n'a pas plusieurs niveaux de profondeur.
Au lieu de cela, vous pouvez y parvenir sans lodash et récursivité. Vous pouvez utiliser .flatMap code>
pour obtenir chaque tableau job
, puis créez un objet individuel pour chaque élément de ce tableau job
à l'aide de .map
.
Voir l'exemple ci-dessous:
const arr = [{name: "A", job: ["1", "2"]}, {name: "B", job: ["2"]}, {name: "C", job: []}]; const spreadArrObj = arr => { return arr.flatMap(({name, job}) => { if(job.length < 2) return {name, job}; // if the object is empty or has one one object then return the object return job.map(elem => ({ // map each element in the job array to its own object name, job: [elem] })); }); } console.log(spreadArrObj(arr));
Voir la compatibilité du navigateur pour .flatMap
ici .
Merci. J'utilise _.flatMap ()
de lodash donc je suppose que ce ne sera pas un problème sur le backend.
@Nithin pas de soucis :), ouais, ça devrait bien fonctionner alors
Vous pouvez utiliser le tableau réduire
et vérifier la longueur du tableau job
. S'il est supérieur à 1, parcourez le tableau de tâches et créez un nouvel objet et envoyez-le vers l'accumulateur
let data = [{ name: "A", job: ["1", "2"] }, { name: "B", job: ["2"] }, { name: "C", job: [] } ] let newData = data.reduce(function(acc, curr) { if (curr.job.length > 1) { curr.job.forEach(function(item) { acc.push({ name: curr.name, job: [item] }) }) } else { acc.push(curr) } return acc; }, []); console.log(newData)
Merci @brk, Cette solution fonctionne également et nous pouvons l'utiliser indépendamment du fait d'avoir du lodash. C'est juste que Nick a répondu en premier et ma question a également satisfait l'exigence de lodash.
Y a-t-il une raison spécifique pour laquelle vous souhaitez utiliser lodash pour ce problème? C'est un problème qui peut très facilement être résolu à l'aide de fonctions javascript natives.
Hey @LarsHoldaas, La raison pour laquelle j'ai préféré
lodash
àVanillaJS
est que si à l'avenir l'imbrication a des sous-nids,lodash
est mieux capable de le gérer . Au moins, c'est ce que je pensais basé sur les capacités normales delodash
.