Dave
Dave

Reputation: 883

Nodejs Google Drive API - Accessing array elements in callback function

I want file names produced using drive.files.list to use as strings for downloading all files in a folder.

I am having trouble accessing an array of filenames. Basically through lack of knowledge, So I am lost by the logic of the mouse over reference of map in files.map() See below code.

My code:

if (files.length) {
      // map method calls the callbackfn one time for each element in the array 
      files.map((file) => {     
      // there are x elements (a filename/id) called x times     

  // I want to access one filename at a time. Return a plain string filename for a downloadFile() function    
        var names = [];    
      
  //  rough test to produce desired output. Produces 'undefined' for array indexes greater than 0 e.g names[1]
  //      files.length = 1; 

  // Without the files.length = 1; filename is outputted x times 
        var names = [];    
        files.forEach(function (file, i) {
          names[i]= file.name;
      })
// first array index (with files.length =1;) first filename and only this filename. Correct result!!! 
      console.log(names[0]);

I don't have much experience with OOP or Nodejs. But using various tests (code changes) the largest output looked like an array of arrays. I want to narrow it down to an array of filenames that I can JSON.stringify before using for downloading.

Mouse over of 'map'

(method) Array<drive_v3.Schema$File>.map<void>(callbackfn: (value: drive_v3.Schema$File, index: number, array: drive_v3.Schema$File[]) => void, thisArg?: any): void[]
Calls a defined callback function on each element of an array, and returns an array that contains the results.

@param callbackfn — A function that accepts up to three arguments. The map method calls the callbackfn function one time for each element in the array.

@param thisArg — An object to which the this keyword can refer in the callbackfn function. If thisArg is omitted, undefined is used as the this value.

Any suggestions apprecieated.

Upvotes: 0

Views: 125

Answers (1)

traynor
traynor

Reputation: 8717

Try replacing the code with this one:

if (files.length) {

  var names = [];
  files.forEach(function(file, i) {
    names.push(file.name);
  });

  console.log('filenames: ', names);
}

and then you can read the filenames by looping through names array, and pass it to other functions for processing:

names.forEach((fileName, i)=>{
  console.log('filename: ', fileName, ' index', i);
  // pass the name to other functions for processing
  download(fileName);
});

Upvotes: 2

Related Questions