简体   繁体   中英

Create array of objects from another array of objects

(Sorry for the title)

What is the best way to turn this:

[
    {
      directory: 'video_0',
      files: [ 'comp_0.mp4', 'comp_1.mp4' ],
      uploadedFiles: ['video_0/comp_0.mp4','video_0/comp_1.mp4']
    },
    {
      directory: 'video_1',
      files: [ 'comp_0.mp4', 'comp_1.mp4' ],
      uploadedFiles: ['video_1/comp_0.mp4','video_1/comp_1.mp4']
    },
    {
      directory: 'video_2',
      files: [ 'comp_0.mp4', 'comp_1.mp4' ],
      uploadedFiles: ['video_2/comp_0.mp4','video_2/comp_1.mp4']
    }
  ]

Into this:

[
  {
    file: 'comp_0.mp4',
    directory: 'video_0',
    uploadedFile: 'video_0/comp_0.mp4',
  },
  {
    file: 'comp_1.mp4',
    directory: 'video_0',
    uploadedFile: 'video_0/comp_1.mp4',
  },
  {
    file: 'comp_0.mp4',
    directory: 'video_1',
    uploadedFile: 'video_1/comp_0.mp4',
  },
  {
    file: 'comp_1.mp4',
    directory: 'video_1',
    uploadedFile: 'video_1/comp_1.mp4',
  },
  {
    file: 'comp_0.mp4',
    directory: 'video_2',
    uploadedFile: 'video_2/comp_0.mp4',
  },
  {
    file: 'comp_1.mp4',
    directory: 'video_2',
    uploadedFile: 'video_2/comp_1.mp4',
  }]

And then back again...

I receive data in a certain structure, then I need to create a task list for each file. Then convert it back to it's original structure. I'm sure there will be some clever ES6 way of doing this but I can't figure it out.

a very crude implementation would be:

const data = [
  {
    directory: 'video_0',
    files: ['comp_0.mp4', 'comp_1.mp4'],
    uploadedFiles: ['video_0/comp_0.mp4', 'video_0/comp_1.mp4']
  },
  {
    directory: 'video_1',
    files: ['comp_0.mp4', 'comp_1.mp4'],
    uploadedFiles: ['video_1/comp_0.mp4', 'video_1/comp_1.mp4']
  },
  {
    directory: 'video_2',
    files: ['comp_0.mp4', 'comp_1.mp4'],
    uploadedFiles: ['video_2/comp_0.mp4', 'video_2/comp_1.mp4']
  }
];

const newArr = data.reduce((p, c) => {
  return p.concat(c.files.map((file, i) => {
    return {
      directory: c.directory,
      file,
      uploadedFile: c.uploadedFiles[i]
    };
  }));
}, []);

There are probably much cleaner solutions out there. what I did was a simple array Zip implementation.

you can check more about zipping here: How do I zip two arrays in JavaScript?

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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