Свести массив внутри массива объектов с помощью lodash - PullRequest
1 голос
/ 12 марта 2019

У меня есть Array, как это

[
    {
        name: "A",
        job: ["1", "2"]
    },
    {
        name: "B",
        job: ["2"]
    },
    {
        name: "C",
        job: []
    }
]

Как я могу превратить его в нечто подобное, используя lodash.

[
    {
        name: "A",
        job: ["1"]
    },
    {
        name: "A",
        job: ["2"]
    },
    {
        name: "B",
        job: ["2"]
    },
    {
        name: "C",
        job: []
    }
]

Единственное решение, которое приходит мне в голову, этоитерация рекурсивно.

Спасибо.

Ответы [ 3 ]

2 голосов
/ 12 марта 2019

Вам не нужно использовать рекурсию, если ваш объект не многоуровневый.

Вместо этого вы можете достичь этого без лишнего шума и рекурсии.Вы можете использовать .flatMap, чтобы получить каждый массив job, а затем создать отдельный объект для каждого элемента в этом массиве job, используя .map.

См. Пример ниже:

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

См. Совместимость браузера для .flatMap здесь .

1 голос
/ 12 марта 2019

Вы можете использовать массив reduce и проверить длину массива job. Если оно больше 1, то итерируйте массив заданий, создайте новый объект и отправьте его в аккумулятор

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 голос
/ 12 марта 2019

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