Javascript:将点分隔的字符串转换为嵌套的对象值

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

这些函数也可以让你做更复杂的事情,比如指定数组索引等:)


And*_*ker 8

帮助你入门的东西:

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)