[英]Flatten an array inside an array of objects using lodash
我有一个这样的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: []
}
]
我想到的唯一解决方案是递归迭代。
谢谢。
如果您的对象不是多层,则不需要使用递归。
相反,您可以无需lodash和递归即可实现此目的。 您可以使用.flatMap
获取每个job
数组,然后使用.map
为该job
数组中的每个项目创建一个单独的对象。
请参见下面的示例:
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
浏览器兼容性。
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);
您可以使用数组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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.