我试图创建一个动态提供密钥和值的JS对象。关键是点符号,因此如果提供了类似car.model.color
的字符串,则生成的对象将是:
{
car: {
model: {
color: value;
}
}
}
如果提供的密钥是一个简单的属性,问题有一个简单的解决方案,但我很难使其适用于组合密钥。
我的代码:
function (key, value) {
var object = {};
var arr = key.split('.');
for(var i = 0; i < arr.length; i++) {
object = object[arr[i]] = {};
}
object[arr[arr.length-1]] = value;
return object;
}
答案 0 :(得分:6)
您稍加修改的代码
function f(key, value) {
var result = object = {};
var arr = key.split('.');
for(var i = 0; i < arr.length-1; i++) {
object = object[arr[i]] = {};
}
object[arr[arr.length-1]] = value;
return result;
}
在循环中你应该设置所有的道具,但最后一个。 接下来设置最终属性和所有设置。
答案 1 :(得分:3)
如果您使用的是lodash,则可以使用_.set(object, path, value)
const obj = {}
_.set(obj, "car.model.color", "my value")
console.log(obj)
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.15/lodash.min.js"></script>
答案 2 :(得分:1)
function strToObj(str, val) {
var i, obj = {}, strarr = str.split(".");
var x = obj;
for(i=0;i<strarr.length-1;i++) {
x = x[strarr[i]] = {};
}
x[strarr[i]] = val;
return obj;
}
用法:console.log(strToObj(&#34; car.model.color&#34;,&#34; value&#34;));
答案 3 :(得分:1)
我会使用递归方法。
var createObject = function(key, value) {
var obj = {};
var parts = key.split('.');
if(parts.length == 1) {
obj[parts[0]] = value;
} else if(parts.length > 1) {
// concat all but the first part of the key
var remainingParts = parts.slice(1,parts.length).join('.');
obj[parts[0]] = createObject(remainingParts, value);
}
return obj;
};
var simple = createObject('simple', 'value1');
var complex = createObject('more.complex.test', 'value2');
console.log(simple);
console.log(complex);
(检查控制台输出)
答案 4 :(得分:0)
使用命名空间模式,就像Addy Osmani显示的那样:http://addyosmani.com/blog/essential-js-namespacing/
这里的代码是为了方便而粘贴的,所有功劳都归功于Addy:
// top-level namespace being assigned an object literal
var myApp = myApp || {};
// a convenience function for parsing string namespaces and
// automatically generating nested namespaces
function extend( ns, ns_string ) {
var parts = ns_string.split('.'),
parent = ns,
pl, i;
if (parts[0] == "myApp") {
parts = parts.slice(1);
}
pl = parts.length;
for (i = 0; i < pl; i++) {
//create a property if it doesnt exist
if (typeof parent[parts[i]] == 'undefined') {
parent[parts[i]] = {};
}
parent = parent[parts[i]];
}
return parent;
}
// sample usage:
// extend myApp with a deeply nested namespace
var mod = extend(myApp, 'myApp.modules.module2');