提问者:小点点

动态填充对象


我正在编写一个util方法,它在一个具有已知字段的对象中更改日期格式。 当我试图动态生成字段时,它抛出未定义。


const dateFields = [
  'booking_timestamp',
  'box_timestamp',
  'createdAt',
  'updatedAt'
];
exports.convertToLondon = (arrayToProcess) => {
  console.log(arrayToProcess.booking_timestamp); // 20170421 04:30:00
  const processedArray = dateFields.map(field => {
    console.log(arrayToProcess.field); // undefined
    // const container = {};
    const utcCutoff = moment.utc(arrayToProcess.field, 'YYYYMMDD HH:mm:ss');
    // arrayToProcess.field => i would like to variable to dynamically populate for arrayToProcess.booking_timestamp
    const displayCutoff = utcCutoff.clone().tz('Europe/London');

    console.log('utcCutoff:', utcCutoff.format('YYYYMMDD HH:mm:ssa Z')); // => utcCutoff: 20170421 04:30:00pm +00:00
    console.log('displayCutoff:', displayCutoff.format('YYYYMMDD HH:mm:ss:sssZ')); // => displayCutoff: 20170421 12:30:00pm -04:00
    return null;
  });
  return processedArray;
};

共2个答案

匿名用户

我仍然不知道我是否100%地理解了您的问题,但我认为您希望基于输入对象动态地创建字段。

在这种情况下,解决方案很简单,您需要使用[]表示法而不是表示法访问新字段:

ArrayToProcess.Field-->; ArrayToProcess[field]

因为在第一种情况下,您将尝试访问对象上的字段field:

{
  field: 123
}

而在第二种表示法中,您将访问名为field变量值的属性。

匿名用户

这是因为您试图访问ArrayToProcess.Field,而不是仅访问Field(数组的一个元素)。 您位于.map回调中,其中有field实例。 ArrayToProcess.Field不存在。

您还必须访问函数参数中的数组(arrayToProcess),而不是上面定义的变量(dateFields),因为它不存在于函数的上下文中。

const dateFields = [
  'booking_timestamp',
  'box_timestamp',
  'createdAt',
  'updatedAt'
];
exports.convertToLondon = (arrayToProcess) => {
  console.log(arrayToProcess.booking_timestamp); // 20170421 04:30:00
  const processedArray = arrayToProcess.map(field => { // use arrayToProcess and not dateFields
    console.log(field); // use just field
    // const container = {};
    const utcCutoff = moment.utc(arrayToProcess.field, 'YYYYMMDD HH:mm:ss');
    // arrayToProcess.field => i would like to variable to dynamically populate for arrayToProcess.booking_timestamp
    const displayCutoff = utcCutoff.clone().tz('Europe/London');

    console.log('utcCutoff:', utcCutoff.format('YYYYMMDD HH:mm:ssa Z')); // => utcCutoff: 20170421 04:30:00pm +00:00
    console.log('displayCutoff:', displayCutoff.format('YYYYMMDD HH:mm:ss:sssZ')); // => displayCutoff: 20170421 12:30:00pm -04:00
    return null;
  });
  return processedArray;
};