我正在尝试使用函数式编程解决特定的问题。我的猜测是折叠应该可以完成这项工作,但是到目前为止,解决方案还没弄清我。
从一个点分隔的字符串开始,例如"a.b.c"我要构建一个JavaScript对象,该对象以JS文字表示形式如下:
"a.b.c"
obj = {a:{b:{c:"whatever"}}}
该算法应接受一个种子对象开始。在前面的示例中,种子将为{}。
{}
如果我提供{a:{f:"whatever else"}}种子,结果将是
{a:{f:"whatever else"}}
{a:{f:"whatever else",b:{c:"whatever"}}}
我希望我的描述足够清楚。我不是在谈论字符串操作。我想创建适当的对象。
我之所以使用Javascript,是因为这是现实世界中出现问题的语言,也是实施FP解决方案的语言,我希望在此处提出问题。
编辑:我要解决的主要问题是 如何避免易变的物体 。JS对添加/删除属性过于宽容,在这种情况下,我想确保在FP例程运行期间不会有副作用。
功能齐全的变体:
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"}}}