繁体   English   中英

使用lodash将对象内部的数组展平

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM