【问题标题】:ES6: How can you add a property (which itself is an object) to an object conditionally only if that property existsES6:只有当该属性存在时,如何有条件地向对象添加属性(它本身就是一个对象)
【发布时间】:2023-05-28 14:48:01
【问题描述】:

我正在关注这个伟大的 tutorial,用于根据条件向对象添加(或不添加)属性。

例如:

{  id: 'some-id',  ...(true && { optionalField: 'something'})}

但就我而言,我有一个看起来像这样的对象:

我想做的是如果12-AM 属性存在,不要覆盖它,添加到 its 属性,这是一个名为message 的键,它是一个数组

如果它没有添加新的时间密钥,即1230-AMApril-9-2020

这就是我现在拥有的:

{
  ...dayInfoInChild,
  [currentDate]: { /* April-9-2020 */
    [timeOfDayAndHour]: { /* 12-AM */
      message: textValueContainer, ['foo']
    },
  },
}

但是可惜它没有添加它会覆盖......

任何帮助将不胜感激。

【问题讨论】:

  • 我会说“别再花哨了”
  • 只需使用普通代码和if test 来表达您的逻辑并自己控制事物。
  • 不要使用对象的图像,以文本形式提供示例数据和代码,以及实际和预期结果。
  • 如果你真的必须,你可以使用类似 immutability-helper github.com/kolodny/immutability-helper 的东西(或者写你类似的等价物)。但是你..var m = dayInfoInChild[currentDate][timeOfDayAndHour]; m.message && m.message=m.message.concat(textValueContainer,['foo'])(不确定这是否是你真正想要做的),为什么要让自己的生活变得困难?
  • @user120242 感谢帮助库!我会检查一下。只是一个问题,IAH 我现在的语法不好吗?我错过了什么吗?认为它不是太超出范围......“有一个嵌套对象,这是*/父对象的属性,我如何添加另一个道具?”

标签: javascript ecmascript-6 javascript-objects spread-syntax


【解决方案1】:

不要为此使用对象字面量语法。对象文字适用于您要创建新对象时。相反,操作对象:

// Checking existence:
if (obj[currentDate] && obj[currentDate][timeOfDayAndHour]) {
    console.log('exist');
}

// Checking if message exist:
if (obj[currentDate][timeOfDayAndHour].message) {
    console.log('exist');
}

// Adding message array:
obj[currentDate][timeOfDayAndHour].message = [];

// Adding message array with message:
obj[currentDate][timeOfDayAndHour].message = ['foo'];

// Adding message:
obj[currentDate][timeOfDayAndHour].message.push('foo');

现在,您可以使用上面的操作来实现您的逻辑。我不知道您的确切逻辑是什么,但我们可以演示一种实现。以下是仅在日期存在时如何添加消息的示例,但如果时间或消息数组存在则无关紧要(它将自动创建它们):

function addMessageToDateAutoCreateEverythingElse (obj, date, time, txt) {
  let dateObj = obj[date]

  // Checking date exist:
  if (dateObj) {
    let timeObj = dateObj[time];

    // Auto-create time if not exist
    if (!timeObj) {
      timeObj = {};
      dateObj[time] = timeObj;
    }

    // Auto-create message array if not exist
    if (!timeObj.message) {
      timeObj.message = [];
    }

    // Add new message
    timeObj.message.push(txt);
  }
}  

这只是一个逻辑流程。您可以实现任何您喜欢的逻辑,向任何对象添加任何内容。

【讨论】:

  • 谢谢!我明天试试看!欣赏答案!