能否使用JSONPath-plus从空对象开始构建目标对象?
问题原因及解决方案
核心原因
你的代码未生效的关键在于:JSONPath-plus的callback仅对已存在的匹配节点执行。初始data是空对象,$.book.author这个路径完全不存在,回调函数根本没被触发,自然不会修改原对象。
JSONPath的本质是查询已有节点,默认不会自动创建不存在的嵌套层级。
实现方法
要从空对象构建嵌套对象,有两种可行思路:
思路1:先创建路径层级,再用JSONPath赋值
先通过辅助函数递归创建需要的嵌套路径,再让JSONPath匹配到已存在的节点执行回调:
const data = {}; // 辅助函数:根据路径创建嵌套对象层级 function createNestedPath(obj, path) { const keys = path.replace(/^\$./, '').split('.').filter(Boolean); let current = obj; for (const key of keys) { if (typeof current[key] !== 'object' || current[key] === null) { current[key] = {}; } current = current[key]; } return obj; } // 先创建book.author的路径结构 createNestedPath(data, '$.book.author'); const updater = (cb) => (value, _, { parent, parentProperty }) => { parent[parentProperty] = cb(value); return parent; }; const r = JSONPath({ path: '$.book.author', json: data, callback: updater(() => 'Foo Bar'), }); console.log(data); // 输出:{ book: { author: 'Foo Bar' } }
思路2:直接手动赋值(更高效)
如果是固定结构的嵌套对象,完全不需要依赖JSONPath,直接赋值更简单:
const data = {}; data.book = { author: 'Foo Bar' }; console.log(data);
若为动态路径场景,思路1的辅助函数可配合动态路径使用,比JSONPath更直接。
内容的提问来源于stack exchange,提问作者ar099968
相关产品推荐
相关产品推荐

