Search code examples
arraysionic-frameworkpromisecapacitor

typescript Promise - persist change in mapped array of objects


I am trying to replace the value (file paths) of the key/value entries in an array of objects upon the if-condition, that a file/ or files exist in the file directory Documents ( ios capacitor ionic ); else, just return the array unchanged.

Arrays

   const currentItems = this.data;
   const filenames = [val, val, ...];

// for loop

   for (let filename of filenames) {

// capacitor FileSystem API; promise

    Plugins.Filesystem.stat({
      path:filename+'.jpeg',
      directory: FilesystemDirectory.Documents
    }).then((result) => {

// return path to file in Documents directory ( simplified)

      const result.uri = this.imagepath;

// map array

      const newItems = this.currentItems.map(e => {

// if entries match set the value for key 'linethree'

        if (e.lineone === filename) {
          return {
            ...e,
            linethree: this.imagepath
          }
        }

// else, return e unchanged

        else
          return { ...e,}
      });

    }).catch( reason => {
      console.error( 'onRejected : ' + reason );
    })

}

The problem:

on every iteration - filename of filenames - the original array is mapped again - with its original values; thus each iteration overwrites the change from the previous iteration.

How can it be achieved that the value entry at key 'linethree' for each match - e.lineone === filename - persists ?

Desired replacement:

const filenames = ["uncle"]; 

[{"lineone":"nagybácsi","linetwo":"uncle","linethree":"./assets/imgs/logo.png"}]

[{"lineone":"nagybácsi","linetwo":"uncle","linethree":"_capacitor_/var/mobile/Containers/Data/Application/D95D4DEF-A933-43F1-8507-4258475E1414/Documents/nagybácsi.jpeg"}]


Solution

  • If i understand well you need something like this:

    Solution with Array#Filter, Array#Some and Array#Map

    const wantedImagePath = '_capacitor_/var/mobile/Containers/Data/Application/D95D4DEF-A933-43F1-8507-4258475E1414/Documents/nagybácsi.jpeg';
    
    const fileNames = ["uncle"];
    const someData = [
    {
      "lineone":"ikertestvérek; ikrek",
      "linetwo":"twins",
      "linethree":"./assets/imgs/logo.png"
    },
    {
      "lineone":"nagybácsi",
      "linetwo":"uncle",
      "linethree":"./assets/imgs/logo.png"
    },
    {
      "lineone":"nőtlen (man)",
      "linetwo":"unmarried",
      "linethree":"./assets/imgs/logo.png"
    },
    {
      "lineone": "bar",
      "linetwo": "foo",
      "linethree": "./some/demo/path/logo.png"
    }
    ];
    
    const modifed = someData.filter(x => fileNames.some(y => y === x.linetwo)).map(z => ({ ...z, linethree: wantedImagePath }));
    console.log(modifed)

    Update:

    Solution if you want to keep current data and modify matched:

    const wantedImagePath = '_capacitor_/var/mobile/Containers/Data/Application/D95D4DEF-A933-43F1-8507-4258475E1414/Documents/nagybácsi.jpeg';
    
    const fileNames = ["uncle"];
    const someData = [
    {
      "lineone":"ikertestvérek; ikrek",
      "linetwo":"twins",
      "linethree":"./assets/imgs/logo.png"
    },
    {
      "lineone":"nagybácsi",
      "linetwo":"uncle",
      "linethree":"./assets/imgs/logo.png"
    },
    {
      "lineone":"nőtlen (man)",
      "linetwo":"unmarried",
      "linethree":"./assets/imgs/logo.png"
    },
    {
      "lineone": "bar",
      "linetwo": "foo",
      "linethree": "./some/demo/path/logo.png"
    }
    ];
    
    const modified = someData.map(x => {
      let match = fileNames.find(y => x.linetwo === y);
      return match !== undefined ? ({ ...x, linethree: wantedImagePath }) : x;
    });
    
    console.log(modified)