1
votes

Aplatir un tableau à l'intérieur d'un tableau d'objets à l'aide de lodash

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: []
    }
]


2 commentaires

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 de lodash .


3 Réponses :


1
votes

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);


1 commentaires

Merci. C'est ainsi que j'avais mis en œuvre plus tôt.



2
votes

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 .


2 commentaires

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



1
votes

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)


1 commentaires

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.