我如何从可观察对象创建对象,该对象返回对象数组

时间:2019-12-06 00:30:41

标签: angular typescript

我有一个Observable,它从Web服务中提取一些数据,并返回一个看起来像这样的对象数组。

可观察对象是这样创建的

contactFields$: Observable<IServerDropdownOption[]>;
this.contactFields$ = this.mailTemplateService.templateLookup(this.guids.MAIL_TEMPLATE_CONTACT_FIELDS);

哪个返回这样的内容

[
     {value: "{{ first_name | fallback: "" }}", name: "First Name", selected: undefined},
     {value: "{{ last_name | fallback: "" }}", name: "Last Name", selected: undefined}
]

我需要能够将此对象数组转换为最终看起来像这样的对象。

{
 "{{ first_name | fallback: "" }}" : "First Name",
 "{{ last_name | fallback: "" }}" : "Last Name"
}

修改后的ngOnInit()代码

  ngOnInit() {
    this.contactFields$ = this.mailTemplateService.templateLookup(this.guids.MAIL_TEMPLATE_CONTACT_FIELDS);
    this.contactFields$.subscribe(res => console.log(res));
    this.transformArr();
    this.initForm();
    // Custom button
    FroalaEditor.DefineIcon('my_dropdown', {NAME: 'cog', SVG_KEY: 'cogs'});
    FroalaEditor.RegisterCommand('my_dropdown', {
    title: 'User Fields',
    type: 'dropdown',
    focus: false,
    undo: false,
    refreshAfterCallback: true,
    options: this.result,

    callback(cmd, val) {
        console.log (val);
    },
    // Callback on refresh.
    refresh($btn) {
        console.log ('do refresh');
    },
    // Callback on dropdown show.
    refreshOnShow($btn, $dropdown) {
        console.log ('do refresh when show');
    }
    });

TransformArray代码

transformArr() {
    console.log('Calling Transform');
    this.contactFields$.subscribe(res => {

    this.result = new Object() as { [key: string]: string; };

    for (const each of res) {
        console.log('Looping');
        this.result[each.value] = each.name;
        console.log(this.result);
  }
});
 }

2 个答案:

答案 0 :(得分:1)

androidx.gridlayout.widget.GridLayout mygridLayout = findViewById(R.id.gridLayout);

for(int i=0; i<mygridLayout.getChildCount(); i++){
 ((ImageView) mygridLayout.getChildAt(i)).setImageResource(0);
} 

应根据您的描述工作。

根据您的更新,您应该尝试将此功能与地图运算符一起使用

const transformArr = (arr) => {
   let result = {}
   arr.map(each => {
      result[each.value] = each.name;
   })
   return result;
}

答案 1 :(得分:1)

我会subscribe到必需组件中的observable,而不是使用pipe,因为这会影响您的IServerDropdownOption返回类型。

您已订阅可观察项的组件

contactFields$;
result: { [key: string]: string; };

someFunction() {

    this.contactFields$.subscribe(res => {

      this.result = new Object() as { [key: string]: string; };

      for (const each of res) {
        this.result[each.value.replace('"', '\"')] = each.name;
      }
    });
}

现在,您可以在需要的情况下使用result变量(视情况而定)下拉值。