Tyl*_*ler 7 javascript arrays object lodash
我有一堆对象属性以点分隔的字符串形式出现"availability_meta.supplier.price"
,我需要为其分配相应的值record['availability_meta']['supplier']['price']
等等.
并非所有东西都是3级深度:许多只有1级深度,而且许多深度超过3级.
有没有一种很好的方法在Javascript中以编程方式分配?例如,我需要:
["foo.bar.baz", 1] // --> record.foo.bar.baz = 1
["qux.qaz", "abc"] // --> record.qux.qaz = "abc"
["foshizzle", 200] // --> record.foshizzle = 200
Run Code Online (Sandbox Code Playgroud)
我想我可以一起破解某些东西,但我没有任何好的算法,所以会很感激建议.我正在使用lodash,如果它有用,并对其他可以快速完成此工作的库开放.
编辑它在后端并且不经常运行,因此没有必要优化大小,速度等.实际上代码可读性对于未来的开发者来说将是一个加分.
编辑2这与引用的副本不同.也就是说,我需要能够为同一个对象多次执行此分配,并且"重复"答案将每次只覆盖子键.请重新开启!
Mat*_*Way 10
你在问题中提到了lodash,所以我想我应该添加他们简单的对象set()
和get()
功能.做一些像:
_.set(record, 'availability_meta.supplier.price', 99);
Run Code Online (Sandbox Code Playgroud)
您可以在此处阅读更多相关信息:https://lodash.com/docs#set
这些函数也可以让你做更复杂的事情,比如指定数组索引等:)
帮助你入门的东西:
function assignProperty(obj, path, value) {
var props = path.split(".")
, i = 0
, prop;
for(; i < props.length - 1; i++) {
prop = props[i];
obj = obj[prop];
}
obj[props[i]] = value;
}
Run Code Online (Sandbox Code Playgroud)
假设:
var arr = ["foo.bar.baz", 1];
Run Code Online (Sandbox Code Playgroud)
你用它来称呼它:
assignProperty(record, arr[0], arr[1]);
Run Code Online (Sandbox Code Playgroud)
示例:http://jsfiddle.net/x49g5w8L/
小智 6
那这个呢?
function convertDotPathToNestedObject(path, value) {
const [last, ...paths] = path.split('.').reverse();
return paths.reduce((acc, el) => ({ [el]: acc }), { [last]: value });
}
convertDotPathToNestedObject('foo.bar.x', 'FooBar')
// { foo: { bar: { x: 'FooBar' } } }
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
5007 次 |
最近记录: |