【问题标题】:typescript Promise - persist change in mapped array of objectstypescript Promise - 在映射的对象数组中持续更改
【发布时间】:2019-01-01 09:47:02
【问题描述】:

我试图在 if 条件下替换对象数组中键/值条目的值(文件路径),文件目录 Documents 中存在一个或多个文件(ios 电容器离子);否则,只返回原样的数组。

数组

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

// for 循环

   for (let filename of filenames) {

// 电容 FileSystem API;承诺

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

//返回Documents目录中文件的路径(简化)

      const result.uri = this.imagepath;

// 映射数组

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

// 如果条目匹配,则设置键 'linethree' 的值

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

//否则,原样返回e

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

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

}

问题:

在每次迭代中 - 文件名的文件名 - 原始数组再次映射 - 使用其原始值;因此每次迭代都会覆盖上一次迭代的变化。

如何实现每个匹配项的键“linethree”处的值条目 - e.lineone === 文件名 - 持续存在?

想要的替换:

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"}]

【问题讨论】:

  • 嗨,你能提供演示数据的例子吗?你所拥有的和你需要的结果。谢谢。
  • 用户可以拍照,然后该照片将链接到一个字符串。说:“玫瑰” - 用户为玫瑰拍照。然后我在离子模板中显示字符串玫瑰和玫瑰图片。如果在文件目录中没有找到图片,则会显示一个 dummy.jpeg。我的需要是生成刚刚拍摄的图片的路径并保存到文件目录并替换数组中的虚拟路径.Usind电容器文件系统API。
  • 我的意思是提供一个基本的例子,而不是真实的数据...比如 const filenames = [somedata] const result = [myresult] ?
  • 使用这个小提琴jsfiddle.net/qn0pvrcf更新它,就像我在上一篇文章中所说的那样。

标签: arrays ionic-framework promise capacitor


【解决方案1】:

如果我理解得很好,你需要这样的东西:

Array#FilterArray#SomeArray#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)

更新:

如果要保留当前数据并修改匹配的解决方案:

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)

【讨论】:

  • 好的,谢谢。我将尝试理解其中的逻辑。它是否适用于多个文件名:例如叔叔,双胞胎的照片,但未婚的?换句话说:使用 for (filename of filenames) 循环。
  • 谢谢,这已经非常接近完美了。我的最后一个需要:如果我执行“for (filename of fileNames)” - 叔叔,阿姨 - 使 linethree 在多个条目中发生变化,是否可以在不覆盖“叔叔”变化的情况下工作。我认为它应该与这段代码一起工作,只是问问。
  • 抱歉,无法回答,因为我需要更多信息和更多代码... 一个建议,尝试使用MAPFILTERREDUCESOMEEVERY .... 方法并将其组合在一起而不是 FOR LOOP.... 这是一种更好的方法,无需改变数据和更少的代码。如果您有任何问题,请尝试了解我的解决方案。祝你好运并投票。谢谢。
猜你喜欢
  • 1970-01-01
  • 2019-02-16
  • 1970-01-01
  • 2022-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-04
相关资源
最近更新 更多