寻找一种 FP 算法来从点分隔的字符串组成对象
Looking for an FP algorithm to compose objects from dot-separated strings
我正在尝试使用函数式编程解决特定问题。我的猜测是折叠应该可以完成这项工作,但到目前为止,解决方案一直没有我。
从像"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"}}}
相关文章:
- jQuery分页下一页和上一页按钮在点击零或超过最后一页后失败
- 用键盘分页jQuery下一个和上一个控件.触发器('点击')不'不起作用
- 如何在使用jsPDF将html转换为pdf的同时,在pdf中的某个点进行分页
- DHTMLX-分页后,点击网格重定向到第1页
- JQuery在ace:dataTable分页器上为锚点类单击监听器
- Regex表示用句点分隔的3个3位数的值
- 如何用逗号和句点分隔JavaScript字符串
- 分页没有'当我点击javascript和php按钮时,它不起作用
- 正则表达式表示用连字符分隔的浮点范围(用于年份和月份)
- JS - 用句点分隔字符串以满足特定的字符长度
- 对具有点分隔数字的属性的对象数组进行排序
- 向数字添加百分之一位,该数字可以逗号或句点分隔
- 一旦超时执行,清除或重新分配分配给 setTimeout 返回值的变量是否有任何技术点
- 如何让猫头鹰轮播的每个项目都有一个分页点
- 格式化输入字段,将前4位数字用句点分隔,将后2位数字用句号分隔
- 删除和恢复数据表分页点击功能
- 在整个可点击分区内点击按钮
- 如何对由分隔的数字使用jquery函数.(点)或,(逗号)作为千分隔符
- Javascript Regex匹配由空格分隔但不包含句点的字符串
- 在凌晨1点5分浏览网页