【问题标题】:How to assign values from one object to another in javascript如何在javascript中将值从一个对象分配给另一个对象
【发布时间】:2018-12-19 07:03:02
【问题描述】:

我正在尝试将以下“详细信息”对象中的值分配给“formFields”数组中的每个“模型”。

这是详细信息对象

const details = {
    criteriaName: "hello",
    criteriaType: "type a",
    description: "world"
}

这是 formFields 数组

从上面的详细信息对象中,我试图将每个键的每个值分配给 formFields 数组中的每个模型

const formFields = [
    {
        "title": "Title 1",
        "columns": 2,
        "fields": {
            "criteriaName": {
                "type": "text",
                "label": "Criteria Name",
                "id": 'criteriaName',
                "model": "",
                "required": true,
                "show": true,
                "rules": [
                    v => !!v || 'Criteria Name is required',
                ]
            },
            "criteriaType": {
                "type": "select",
                "label": "Criteria type",
                "id": "criteriaType",
                "options": ['Dependent', 'Independent', 'Static'],
                "model": "",
                "required": true,
                "rules": [
                    v => !!v || 'Criteria Type is required',
                ],
                "show": true,
            },
        }
    },
    {
        'title': "Title 2",
        "columns": 1,
        "fields": {
            "description": {
                "type": "description_notes",
                "label": "Description",
                "id": "description",
                "required": false,
                "model": '',
                "show": true,
            }
        }
    }
]

我怎样才能做到这一点?

谢谢。

【问题讨论】:

标签: javascript ecmascript-6 ecmascript-2016


【解决方案1】:
formFields.forEach((form) => {
    if (form.fields.criteriaName) form.fields.criteriaName.model = details.criteriaName;
    if (form.fields.criteriaType) form.fields.criteriaType.model = details.criteriaType;
    if (form.fields.description) form.fields.description.model = details.description;
})

这会改变原始数组。 你可以阅读更多关于 forEach here

如果你想创建一个新的数组,你可以使用:

let newFormFields = formFields.map((form) => {
    if (form.fields.criteriaName) form.fields.criteriaName.model = details.criteriaName;
    if (form.fields.criteriaType) form.fields.criteriaType.model = details.criteriaType;
    if (form.fields.description) form.fields.description.model = details.description;

    return form;
});

您可以阅读有关地图的更多信息here

【讨论】:

    【解决方案2】:

    欢迎来到 Stack Overflow。以下代码可能会满足您的要求。解释所有细节有点多,但您可以在 cmets 中询问并阅读一些documentation

    const details = {
      criteriaName: 'hello',
      criteriaType: 'type a',
      description: 'world',
    };
    
    const formFields = [
      {
        title: 'Title 1',
        fields: {
          criteriaName: {
            id: 'criteriaName',
            model: '',
          },
          criteriaType: {
            id: 'criteriaType',
            model: '',
          },
        },
      },
      {
        title: 'Title 2',
        fields: {
          description: {
            id: 'description',
            model: '',
          },
          nonExisting: {
            id: 'nonExisting',
            model: 'this will not be replaced',
          },
        },
      },
    ];
    
    const result = formFields.map((formField) => ({
      ...formField,
      fields: Object.entries(formField.fields).reduce(
        (fields, [key, value]) =>
          details[key]
            ? {
                ...fields,
                [key]: { ...value, model: details[key] },
              }
            : fields,
        formField.fields,
      ),
    }));
    
    console.log(result);

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-24
      • 2019-12-27
      • 2016-06-24
      • 1970-01-01
      • 2012-01-06
      • 1970-01-01
      • 1970-01-01
      • 2013-04-03
      相关资源
      最近更新 更多