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

如何在指定位置添加/修改对象键值对(适配YAML转换需求)

如何在指定位置添加/修改对象键值对(确保version处于第二位)

因为后续要将对象转换为YAML格式,对象键的顺序至关重要,需要保证version键始终处于第二位。存在三种场景:

目标状态示例

{
    "$schema": "../../../project-schema.json",
    "version": "1.2.3", // 需要将version添加或移动到此处,并修改值
    "sourceRoot": "apps/backend/src",
    "projectType": "application"
}

场景1:version键完全缺失

{
    "$schema": "../../../project-schema.json",
    "sourceRoot": "apps/backend/src",
    "projectType": "application"
}

场景2:version键位置错误

{
    "$schema": "../../../project-schema.json",
    "sourceRoot": "apps/backend/src",
    "projectType": "application",
    "version": "1.2.3"
}

现有问题

我尝试用reduce函数处理,但该方法仅在version完全缺失时有效:

const insertKey = (key, value, obj, pos) => {
  return Object.keys(obj).reduce((ac, a, i) => {    
    if (i === pos) ac[key] = value
    ac[a] = obj[a]
    return ac
  }, {})
}

insertKey('version', '2.3.4', obj, 1)

解决方案

可以通过以下函数处理所有场景,确保目标键被插入/移动到指定位置并更新值:

const insertOrMoveKey = (targetKey, targetValue, obj, targetPos) => {
  // 移除原对象中的目标键(避免重复)
  const { [targetKey]: _, ...restObj } = obj;
  const restKeys = Object.keys(restObj);
  // 在指定位置插入目标键,生成新的键顺序数组
  const newKeyOrder = [...restKeys.slice(0, targetPos), targetKey, ...restKeys.slice(targetPos)];
  // 按新顺序构建对象
  return newKeyOrder.reduce((result, key) => {
    result[key] = key === targetKey ? targetValue : restObj[key];
    return result;
  }, {});
};

测试示例

处理version缺失的对象

const objWithoutVersion = {
    "$schema": "../../../project-schema.json",
    "sourceRoot": "apps/backend/src",
    "projectType": "application"
};
console.log(insertOrMoveKey('version', '2.3.4', objWithoutVersion, 1));

输出:

{
    "$schema": "../../../project-schema.json",
    "version": "2.3.4",
    "sourceRoot": "apps/backend/src",
    "projectType": "application"
}

处理version位置错误的对象

const objWithWrongVersionPos = {
    "$schema": "../../../project-schema.json",
    "sourceRoot": "apps/backend/src",
    "projectType": "application",
    "version": "1.2.3"
};
console.log(insertOrMoveKey('version', '2.3.4', objWithWrongVersionPos, 1));

输出:

{
    "$schema": "../../../project-schema.json",
    "version": "2.3.4",
    "sourceRoot": "apps/backend/src",
    "projectType": "application"
}

处理version位置正确的对象

const objWithCorrectVersionPos = {
    "$schema": "../../../project-schema.json",
    "version": "1.2.3",
    "sourceRoot": "apps/backend/src",
    "projectType": "application"
};
console.log(insertOrMoveKey('version', '2.3.4', objWithCorrectVersionPos, 1));

输出:

{
    "$schema": "../../../project-schema.json",
    "version": "2.3.4",
    "sourceRoot": "apps/backend/src",
    "projectType": "application"
}

逻辑说明

  1. 先通过解构赋值移除原对象中的目标键,避免重复添加
  2. 基于剩余键的数组,在指定位置插入目标键,生成新的键顺序
  3. 遍历新的键顺序数组构建对象,目标键使用传入的新值,其余键保留原对象的值

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 14:40:23