从多个中获取单个数组

Posted

技术标签:

【中文标题】从多个中获取单个数组【英文标题】:Fetch single array from multiple 【发布时间】:2019-05-08 20:44:13 【问题描述】:

我正在制作 Angular 应用程序,我正在制作一个 forEach 函数,其中包含服务,例如,

   this.data.forEach(function(element) => 
      this.appService.getRest(element.optionsUrl, localStorage.getItem('token')).subscribe(result => 
           element.options = result.data;
           this.getIntake(this.data);
         );
    );

在这里,我试图将来自服务的结果存储到element.options,然后我调用一个函数来取回用element.options 填充的data 值,因为只有从服务中我才能获得值options 所以在那之后我需要将此数据发送到一个函数并需要检索它..

result.data 是一个数组,它给出以下三个,["id":1,"name":"option1"],["id":2,"name":"option2"],["id":3,"name":"option3"] 分别为三个..

this.getIntake(data);函数中如果我console.log(data)

getIntake(data) 
 console.log(data);

然后它会多次使用相同的值给出相同的数组,例如..

[
"name":"abc", value: "abc", optionUrl: "abcUrl", options: ["id":1,"name":"option1"],
"name":"def", value: "def", optionUrl: "defUrl", options: ["id":2,"name":"option2"],
"name":"ghi", value: "ghi", optionUrl: "ghiUrl",  options: ["id":3,"name":"option3"]
]


[
"name":"abc", value: "abc", optionUrl: "abcUrl", options: ["id":1,"name":"option1"],
"name":"def", value: "def", optionUrl: "defUrl", options: ["id":2,"name":"option2"],
"name":"ghi", value: "ghi", optionUrl: "ghiUrl",  options: ["id":3,"name":"option3"]
]

[
"name":"abc", value: "abc", optionUrl: "abcUrl", options: ["id":1,"name":"option1"],
"name":"def", value: "def", optionUrl: "defUrl", options: ["id":2,"name":"option2"],
"name":"ghi", value: "ghi", optionUrl: "ghiUrl",  options: ["id":3,"name":"option3"]
]

由于data有3个对象,所以反射了3次..

对于每个对象都有 element.optionsUrl,我需要订阅它并需要将数据存储在 element.options 中,如果我退出服务,我没有得到选项中的值,所以我在里面创建一个函数服务并将this.dataoptions 传递给它。在该函数中,我正在获取带有值的数据,但我只需要获取一次完全填充的数据,但它给出了三个,因为数据有三个对象。从那如何得到最后一个填充数据的数组,而不是三个。

Stackblitz https://stackblitz.com/edit/angular-kwvjqu

由于服务延迟,我正在服务的运行时调用函数并发送数据..

如何使用纯 angular/typescript、javascript 方式从这个多个生成的数组中只获取一个数组??

【问题讨论】:

您可以创建一个不允许重复的Set()。不确定是否需要创建重复数据的能力... 为什么要为数组中的每个元素记录整个数组? 如果我退出服务,那么我将丢失存储的选项数据,因此我在服务内拨打电话.. 为什么要遍历它而不是传递整个数组呢? @Justcode,我正在迭代this.data,因为我有optionUrl,我将从那里获取options 的数据,所以我在forEach 内部进行服务调用。如果我停止服务,我无法获取数据,因此无法在服务调用中传递它。所以选项值将在服务内部设置,所以我试图在this.getIntake(this.data) 函数中发送this.data 并尝试获取并且已知它会返回三个.. 我怎样才能只得到一个.. 有没有其他选择请帮助我.. 【参考方案1】:

由于您在 forEach 中为数组中的每个元素触发请求,因此它将订阅多次,因此您会看到它记录了 3 次。

RxJS 提供帮助。

而不是使用from 循环通过您的ArrayforEach 使用from,它将您的Array 转换为Observable 的数组,然后您可以使用它来执行操作,例如触发http 请求。

from(this.data)  //Converts your data array to array of Observables
.pipe(
    mergeMap(element => 
        return this.appService.getRest(element.optionsUrl, localStorage.getItem('token')) //fires http request for each element
        .pipe(
            map((result) =>   //change the data
                element.options = result.data;
                return of(element); //returns an observable for each element
            )
        )
    ),
    combineAll() //combines all the observable into one
)
.subscribe(x=>
    this.getIntake(x); //x contains an array of your element
);

【讨论】:

我可以像这样stackblitz.com/edit/async-await-angular-demo-ae24ur 使用服务调用来进行stackblitz 吗?如果您通过修改上述stackblitz 来实施您的解决方案将会很有帮助。

以上是关于从多个中获取单个数组的主要内容,如果未能解决你的问题,请参考以下文章

如何在javascript中从多个数组中获取单个数组[重复]

从 SQL 表获取的数组中的单个 IF 语句与多个 IF 语句 [关闭]

单个查询从具有不同列的多个表中获取记录

从 ios 中的 Url 获取多个图像

如何从 React 中的数组中获取值? [关闭]

如何从数组中获取单个字段