admin 管理员组

文章数量: 1086019

I have an array that contains multiple objects. These objects also contain arrays of objects like this:

const data =
    [
        {
            id: 1, name: "Jack", interests: 
            [
                {id: 9, name: "basketball"},
                {id: 8, name: "art"}
            ]
        },
        {
            id: 2, name: "Jenny", interests: 
            [
                {id: 7, name: "reading"},
                {id: 6, name: "running"}
            ]
        }
    ];

I would like to push both interests arrays into a new array like so:

newArray = 
    [
        [{id: 9, name: "basketball"}, {id: 8, name: "art"}],
        [{id: 7, name: "reading"},{id: 6, name: "running"}]
    ];

This pushes the data to the new array, but the data isn't nested anymore this way:

data.map(v => { v.interests.map(x => { newArray.push({name: x.name, id:x.id}) }) })

How can I push the interests data to new array while keeping its nested structure?

I have an array that contains multiple objects. These objects also contain arrays of objects like this:

const data =
    [
        {
            id: 1, name: "Jack", interests: 
            [
                {id: 9, name: "basketball"},
                {id: 8, name: "art"}
            ]
        },
        {
            id: 2, name: "Jenny", interests: 
            [
                {id: 7, name: "reading"},
                {id: 6, name: "running"}
            ]
        }
    ];

I would like to push both interests arrays into a new array like so:

newArray = 
    [
        [{id: 9, name: "basketball"}, {id: 8, name: "art"}],
        [{id: 7, name: "reading"},{id: 6, name: "running"}]
    ];

This pushes the data to the new array, but the data isn't nested anymore this way:

data.map(v => { v.interests.map(x => { newArray.push({name: x.name, id:x.id}) }) })

How can I push the interests data to new array while keeping its nested structure?

Share Improve this question asked May 22, 2018 at 4:27 VialitoVialito 5238 silver badges29 bronze badges
Add a ment  | 

1 Answer 1

Reset to default 12

Just .map the interests of each item:

const data=[{id:1,name:"Jack",interests:[{id:9,name:"basketball"},{id:8,name:"art"}]},{id:2,name:"Jenny",interests:[{id:7,name:"reading"},{id:6,name:"running"}]}]
const mapped = data.map(({ interests }) => interests);
console.log(mapped);

When mapping, you don't want to use push to a new array you've created beforehand; instead you want to use return (or use an arrow function's implicit return) for each new array item. (You're currently using the .map as a forEach)

If you don't want to just map the interests array and need to transform the objects as well, then it's a bit more plicated; you'll have to use a nested map as well:

const data=[{id:1,name:"Jack",interests:[{id:9,name:"basketball",foo:'bar'},{id:8,name:"art",foo:'bar'}]},{id:2,name:"Jenny",interests:[{id:7,name:"reading",foo:'bar'},{id:6,name:"running",foo:'bar'}]}]
const mapped = data.map(({ interests }) =>
  // Use only `id` and `foo` properties, discard the `name`s:
  interests.map(({ id, foo }) => ({ id, foo }))
);
console.log(mapped);

本文标签:

Error[2]: Invalid argument supplied for foreach(), File: /www/wwwroot/roclinux.cn/tmp/view_template_quzhiwa_htm_read.htm, Line: 58
File: /www/wwwroot/roclinux.cn/tmp/route_read.php, Line: 205, include(/www/wwwroot/roclinux.cn/tmp/view_template_quzhiwa_htm_read.htm)
File: /www/wwwroot/roclinux.cn/tmp/index.inc.php, Line: 129, include(/www/wwwroot/roclinux.cn/tmp/route_read.php)
File: /www/wwwroot/roclinux.cn/index.php, Line: 29, include(/www/wwwroot/roclinux.cn/tmp/index.inc.php)