JS将字符串转换为多维对象键

时间:2016-08-21 07:17:29

标签: javascript

我有一个字符串,例如:

convert.lamp.stamp.glass.nose 

我想创建一个对象键'nose'(坦克对象已经创建):

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

我该怎么做?

我使用split

获得了数组
values = 'convert.lamp.stamp.glass.nose'.split('.');

现在我不知道如何使用jquery的每个方法来创建这些键。

2 个答案:

答案 0 :(得分:1)

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

此提案使用



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);




答案 1 :(得分:0)

您可以执行以下操作,但是您还应该为此处的nose最后一个属性提供值。我为这个名为Object.prototype.setNestedValue()做了一个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));