通过点符号(如字符串)动态创建对象

时间:2014-11-13 12:33:56

标签: javascript

我试图创建一个动态提供密钥和值的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;
}

5 个答案:

答案 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');