You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ES6下有没有单行方案实现对象数组属性初始化并追加值?

ES6对象数组属性追加值的简化实现方案

问题描述

初始化对象的数组属性后再追加值通常需要两步操作,现有需求是找到更优的单行实现方案,示例场景见下方appendError(prop, error)方法:

  • 使用原生JS或者lodash有没有单行或者更简洁的实现方式?
  • 可选链等新特性暂不能使用的前提下,有没有兼容的解决方案?类似PHP中$array[prop][] = val;的直接赋值效果。

原始实现代码:

class Errors {
  constructor(fields ) {
      this.errors = {};
  }

  /**
   * 给指定字段追加错误信息
   *
   * @param {string} prop | 示例: "email"
   * @param {string} error | 示例: "Invalid email"
   */
  appendError(prop, error) {
      /* 属性不存在时先初始化空数组 */
      if (!this.has(prop)) this.errors[prop] = [];
      /* 再追加错误值 */
      this.errors[prop].push(error);
  }

  /**
   * 判断指定字段是否存在错误
   *
   * @param {string} prop
   */
  has(prop) {
      return this.errors.hasOwnProperty(prop);
  }
}

可用方案

原生JS实现

无需额外依赖,兼容所有ES6+环境的单行写法:

appendError(prop, error) {
  (this.errors[prop] || (this.errors[prop] = [])).push(error);
}

逻辑说明:先判断this.errors[prop]是否为真值,不存在则初始化空数组,返回数组实例后直接调用push方法追加值,和原始实现逻辑完全等价。

如果你的环境支持ES2021新增的逻辑或赋值运算符||=,可以写得更易读:

// 两行写法可读性更高,也可以用逗号运算符合并为单行
appendError(prop, error) {
  this.errors[prop] ||= [];
  this.errors[prop].push(error);
}

Lodash实现

如果项目中已经引入了lodash,可以用内置的_.update方法实现,写法更简洁:

appendError(prop, error) {
  _.update(this.errors, prop, val => (val || []).concat(error));
}

_.update会自动处理目标属性不存在的场景,直接传入更新函数即可完成追加操作。

内容的提问来源于stack exchange,提问作者Nolan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 14:57:01