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àVanillaJSest que si à l'avenir l'imbrication a des sous-nids,lodashest mieux capable de le gérer . Au moins, c'est ce que je pensais basé sur les capacités normales delodash.