如何在指定位置添加/修改对象键值对(适配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" }
逻辑说明
- 先通过解构赋值移除原对象中的目标键,避免重复添加
- 基于剩余键的数组,在指定位置插入目标键,生成新的键顺序
- 遍历新的键顺序数组构建对象,目标键使用传入的新值,其余键保留原对象的值
内容的提问来源于stack exchange,提问作者user3142695
相关产品推荐
相关产品推荐

