将字符串转换成多维对象键

JS Convert string into multi dimensional object keys

本文关键字:对象 字符串 转换      更新时间:2023-09-26

我有一个字符串,例如:

convert.lamp.stamp.glass.nose 

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

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

我该怎么做呢?

我使用分割得到数组

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

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

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

这个建议使用

  • String#split
  • Array#reduce
  • ,如果对象不存在,则默认为v || {}

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

您可以这样做,但是您还应该为最后一个属性提供一个值,这里是nose。我做了一个物体。原型方法,称为Object.prototype.setNestedValue(),它将允许您动态地完成此工作。它将接受一个字符串或整数数组,这些字符串或整数将用作嵌套属性,数组中的最后一项将用作值。如果数组项是整数,它将生成一个数组对象。

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