如何更新对象数组中的对象字段?

时间:2019-05-03 13:41:52

标签: javascript mongoose graphql

我正在使用GraphQL更新保留在另一个数组中的数组内的对象。所以我的模式就是这样

const InstalmentsGroupSchema = new Schema(
  {
    offer: {
      type: Schema.Types.ObjectId,
      ref: "Offer"
    },
    instalments: [
      {
        instalmentCount: { type: Number },
        instalmentAmout: { type: Number },
        dueTo: { type: Date },
        observations: { type: String },
        requestedAmount: { type: Number },
        acceptedRequest: { type: Boolean }
      }
    ]
  },
  { timestamps: true }
);

我想要做的就是更新这样一个分期付款的字段

updateInstalmentGroup: async (
    _,
    { _id, instalmentId, ...args },
    { user }
  ) => {
    try {
      await requireAuth(user);
      const instalmentGroup = await InstalmentsGroup.findOne({
        _id
      });

      if (!instalmentGroup) {
        throw new Error("Not found!");
      }

      const instalments = instalmentGroup.instalments;


      Object.assign(
        instalments,
        instalments.map(instalment =>
          instalment.id === instalmentId ? args : instalment
        )
      );

      return instalmentGroup.save();
    } catch (error) {
      throw error;
    }
  }
};

现在,当我尝试在此处更新它时,问题就来了

此部分正在更新,但替换所有字段。因此,如果我更新observations字段,则会删除其他字段

instalments.map(instalment =>
  instalment.id === instalmentId ? args : instalment
)

如果我尝试这种方式,将根本不会更新

instalments.map(instalment =>
  instalment.id === instalmentId ? {...instalment, args} : instalment
)

已解决

const instalmentToUpdate = instalments.find(
  instalment => instalment.id === instalmentId
);

Object.assign(instalmentToUpdate, args);

1 个答案:

答案 0 :(得分:0)

  

如果我尝试这种方式,将根本不会更新

     

instalments.map(instalment => instalment.id === instalmentId ? {...instalment, args} : instalment )

由于“ args是一个数组,因此它“不更新”(实际上是更新),请尝试以下操作:

instalments.map(instalment =>
  instalment.id === instalmentId ? {...instalment, ...args} : instalment )