数组值中的对象名称

时间:2019-07-14 09:57:52

标签: javascript arrays object javascript-objects

我有一些值的数组:

let typeArray = ["name", "strret", "car", "type"];

我有一个对象:

let formDefinitionObject = {schema:{}}

我希望formDefinitionObject对象像:

let formDefinitionObject = {
  schema: {
    name: {
      type: 'string',
      title: 'Name',
      required: true
    },
    strret: {
      type: 'string',
      title: 'Strret'
    },
    car: {
      type: 'string',
      title: 'Car'
    },
    type: {
      type: 'string',
      title: 'Type'
    }
  }
}

我希望动态地使数组中的每个项目成为formDefinitionObject.schema对象中的对象。例如,如果我在数组typeArray.push('country')中添加一个项目,以自动在formDefinitionObject.schema对象中添加此对象。

3 个答案:

答案 0 :(得分:1)

无法理解required: true的位置。剩余的操作可以按如下操作

var getFormDefinition = function(arr) {
  function getSchemaObj(arr) {
    return arr.map(d => ({
        [d]: {
          type: typeof(d),
          title: d
        }
      }))
      .reduce((a, b) => ({ ...a, ...b }))
  }

  var schemaObj = getSchemaObj(arr)

  arr.push = function(...d) {
    Object.assign(schemaObj, getSchemaObj(d))

    return Array.prototype.push.call(arr, ...d)
  }
  return ({
    schema: schemaObj
  })
}

var typeArray = ["name", "strret", "car", "type"];
var result = getFormDefinition(typeArray)
console.log(result)

typeArray.push('nitish')
console.log(result)


答案 1 :(得分:0)

您可以将Proxy上的typeArrayset陷阱一起使用,因此每次将新值推送到代理数组时,也可以向架构中添加新属性。这样,您可以模拟观察者模式。

您还可以创建一些模式来添加其他属性,例如required,例如name:prop1:prop2,但是这种方式将值固定为true

let typeArray = ["name:required", "strret", "car", "type"];
let formDefinitionObject = {
  schema: {}
}

let proxyArray = new Proxy(typeArray, {
  set(obj, prop, value) {
    if (prop != 'length') addToSchema(formDefinitionObject.schema, value);
    return Reflect.set(...arguments);
  }
})

function capitalize(string) {
  return string.charAt(0).toUpperCase() + string.slice(1);
}

function addToSchema(schema, prop) {
  const [name, ...params] = prop.split(':');
  schema[name] = {
    type: 'string',
    title: capitalize(name)
  }
  params.forEach(param => schema[name][param] = true);
  return schema;
}

proxyArray.reduce(addToSchema, formDefinitionObject.schema);

proxyArray.push('email:required:isEmail');
proxyArray.push('phone');

console.log(formDefinitionObject)

更新:您可以使用类似name:prop1|value:prop2的属性添加true以外的属性值,但是如果您未指定值,则默认值仍为true

let typeArray = ["name:required", "strret", "car", "type"];
let formDefinitionObject = {
  schema: {}
}

let proxyArray = new Proxy(typeArray, {
  set(obj, prop, value) {
    if (prop != 'length') addToSchema(formDefinitionObject.schema, value);
    return Reflect.set(...arguments);
  }
})

function capitalize(string) {
  return string.charAt(0).toUpperCase() + string.slice(1);
}

function addToSchema(schema, prop) {
  const [name, ...params] = prop.split(':');
  schema[name] = {
    type: 'string',
    title: capitalize(name)
  }

  params.forEach(param => {
    const [key, value] = param.split('|');
    schema[name][key] = value ? value : true 
  });
  return schema;
}

proxyArray.reduce(addToSchema, formDefinitionObject.schema);

proxyArray.push('email:required:isEmail');
proxyArray.push('phone:default|123/555-333:required');
proxyArray.push('address')

console.log(formDefinitionObject)

答案 2 :(得分:0)

即使您没有进一步说明字段必须为(\w+)\s\[[^]]*] 还是任何字段都必须为required的情况,但这还是基于您到目前为止提供的解决方案。

下一个代码片段完成了工作,并且有一些解释:

string

如果您在评论部分回答我们的问题,我会在这里。

然后,希望我能进一步推动您前进。