2016-08-21 43 views
2

我有一个字符串,例如:JS将字符串转换成多维对象键

convert.lamp.stamp.glass.nose 

,我要创建“鼻子”(已创建坦克对象)一个对象键:

tank['convert']['lamp']['stamp']['glass']['nose'] 

我该怎么做?

我采用分体式

values = 'convert.lamp.stamp.glass.nose'.split('.'); 

现在我不知道如何使用jQuery的每一个方法来创建这些密钥得到阵列。

+1

74 REP(很快将除非你改变你的问题要少得多),你应该知道怎么问。请张贴代码和努力 – mplungjan

+0

你好,感谢编辑:) –

+0

这仍然不是一个好问题。请显示你的努力。你需要分割或映射 – mplungjan

回答

0

您可以拆分字符串并将其用作对象的键。

这个建议使用

var object = { convert: { lamp: { stamp: { glass: { nose: 42 } } } } }, 
 
    path = 'convert.lamp.stamp.glass.nose', 
 
    value = path.split('.').reduce(function (v, k) { 
 
     return (v || {})[k]; 
 
    }, object); 
 

 
console.log(value);

ES6

var object = { convert: { lamp: { stamp: { glass: { nose: 42 } } } } }, 
 
    path = 'convert.lamp.stamp.glass.nose', 
 
    value = path.split('.').reduce((v, k) => (v || {})[k], object); 
 

 
console.log(value);

用于创建对象,用给定的键,你可以使用这个

var object = {}, 
 
    path = 'convert.lamp.stamp.glass.nose'.split('.'), 
 
    last = path.pop(); 
 

 
path.reduce(function (o, k) { 
 
    o[k] = o[k] || {}; 
 
    return o[k]; 
 
}, object)[last] = 42; 
 

 
console.log(object);

ES6

var object = {}, 
 
    path = 'convert.lamp.stamp.glass.nose'.split('.'), 
 
    last = path.pop(); 
 

 
path.reduce((o, k) => o[k] = o[k] || {}, object)[last] = 42; 
 
console.log(object);

0

你可以做如下,但是你也应该为最后一个属性是nose这里的值。我为这个名为Object.prototype.setNestedValue()的Object.prototype方法做了一个Object.prototype方法,它可以让你动态地完成这项工作。它将采用一组将用作嵌套属性的字符串或整数,并将使用该数组中的最后一项作为值。如果数组项是整数,它将生成一个数组对象。

Object.prototype.setNestedValue = function(...a) { 
 
    a.length > 2 ? typeof this[a[0]] === "object" && this[a[0]] !== null ? this[a[0]].setNestedValue(...a.slice(1)) 
 
                     : (this[a[0]] = typeof a[1] === "string" ? {} : new Array(a[1]), 
 
                     this[a[0]].setNestedValue(...a.slice(1))) 
 
       : this[a[0]] = a[1]; 
 
    return this; 
 
}; 
 

 
var tank = {}; 
 
    props = "convert.lamp.stamp.glass.nose".split("."); 
 
props.push(100) // lets assign a value to the nose property 
 
tank.setNestedValue(...props); 
 
console.log(JSON.stringify(tank,null,2));