寻找一种 FP 算法来从点分隔的字符串组成对象

Looking for an FP algorithm to compose objects from dot-separated strings

本文关键字:分隔 点分 字符串 对象 一种 算法 FP 寻找      更新时间:2023-09-26

我正在尝试使用函数式编程解决特定问题。我的猜测是折叠应该可以完成这项工作,但到目前为止,解决方案一直没有我。

从像"a.b.c"这样的点分隔字符串开始,我想构建一个 Javascript 对象,它在 JS 文字表示法中如下所示:

obj = {a:{b:{c:"whatever"}}}

算法应接受种子对象作为开始。在前面的示例中,种子将{}

如果我提供{a:{f:"whatever else"}}作为种子,结果将是

{a:{f:"whatever else",b:{c:"whatever"}}}

我希望我的描述足够清楚。我不是在谈论字符串操作。我想创建适当的对象。

我正在使用Javascript,因为这是出现这个现实世界问题的语言,我将在这里实现FP解决方案,我希望通过在这里提问找到。

编辑:我试图解决的主要问题是如何避免可变对象。JS在添加/删除属性方面过于宽松,在这种情况下,我想确保在FP例程运行期间不会有任何副作用。

var seed = {},
    str = "a.b.c";
str.split(".").reduce(function(o, p) {
    return p in o ? o[p] : (o[p] = {});
}, seed);
console.log(seed); // {"a":{"b":{"c":{}}}}

一个功能齐全的变体:

function traverse(tree, path, leftover) {
    if (!tree || !path.length)
        return leftover(path);
    var ntree = {};
    for (var p in tree)
        ntree[p] = tree[p];
    ntree[path[0]] = traverse(tree[path[0]], path.slice(1), leftover);
    return ntree;
}
function create(path, value) {
    if (!path.length)
        return value;
    var tree = {};
    tree[path[0]] = create(path.slice(1), value);
    return tree;
}
function set(tree, pathstring, value) {
    return traverse(tree, pathstring.split("."), function(path) {
        return create(path, value);
    });
}

var seed = {a:{f:"whatever else"}};
var obj = set(seed, "a.b.c", "whatever")
    // {"a":{"f":"whatever else","b":{"c":"whatever"}}}
set({}, "a.b.c", "whatever")
    // {"a":{"b":{"c":"whatever"}}}