将字符串隐藏到javascript中的对象

Covert string to object in javascript

本文关键字:对象 javascript 字符串 隐藏      更新时间:2023-09-26

我需要转换字符串

1. "user.member.staffAddress"
2. "user.something"

到对象:

1. { user: { member: { staffAddress: {} } } }
2. { user: { something: {} } }

有人有优雅的方法吗?它应该始终是对象中的对象。最后一个属性应该是空的。

我写了一个实用程序,我认为您会发现它对此很有帮助:https://github.com/forms-js/forms-js/blob/master/source/utils/flatten.ts

以下是相关的部分。它是用TypeScript编写的,但如果删除:type注释,它就是有效的JavaScript。

/**
 * Writes a value to the location specified by a flattened key and creates nested structure along the way as needed.
 *
 * <p>For example, writing "baz" to the key 'foo.bar' would result in an object <code>{foo: {bar: "baz"}}</code>.
 * Writing 3 to the key 'foo[0].bar' would result in an object <code>{foo: [{bar: 3}]}</code>.
 */
function write(value:any, flattenedKey:string, object:any):void {
  var currentKey:any;
  var keyIndexStart = 0;
  for (var charIndex = 0, length = flattenedKey.length; charIndex < length; charIndex++) {
    var character = flattenedKey.charAt(charIndex);
    switch(character) {
      case '[':
        currentKey = flattenedKey.substring(keyIndexStart, charIndex);
        createPropertyIfMissing_(currentKey, object, Array);
        break;
      case ']':
        currentKey = flattenedKey.substring(keyIndexStart, charIndex);
        currentKey = parseInt(currentKey); // Convert index from string to int
        // Special case where we're targeting this object in the array
        if (charIndex === length - 1) {
          object[currentKey] = value;
        } else {
          // If this is the first time we're accessing this Array key we may need to initialize it.
          if (!object[currentKey] && charIndex < length - 1) {
            switch(flattenedKey.charAt(charIndex + 1)) {
              case '[':
                object[currentKey] = [];
                break;
              case '.':
                object[currentKey] = {};
                break;
            }
          }
          object = object[currentKey];
        }
        break;
      case '.':
        currentKey = flattenedKey.substring(keyIndexStart, charIndex);
        // Don't do anything with empty keys that follow Array indices (e.g. anArray[0].aProp)
        if (currentKey) {
          createPropertyIfMissing_(currentKey, object, Object);
        }
        break;
      default:
        continue; // Continue to iterate...
        break;
    }
    keyIndexStart = charIndex + 1;
    if (currentKey) {
      object = object[currentKey];
    }
  }
  if (keyIndexStart < flattenedKey.length) {
    currentKey = flattenedKey.substring(keyIndexStart, flattenedKey.length);
    object[currentKey] = value;
  }
}
/**
 * Helper method for initializing a missing property.
 *
 * @throws Error if unrecognized property specified
 * @throws Error if property already exists of an incorrect type
 */
function createPropertyIfMissing_(key:string, object:any, propertyType:any):void {
  switch(propertyType) {
    case Array:
      if (!object.hasOwnProperty(key)) {
        object[key] = [];
      } else if (!(object[key] instanceof Array)) {
        throw Error('Property already exists but is not an Array');
      }
      break;
    case Object:
      if (!object.hasOwnProperty(key)) {
        object[key] = {};
      } else if (typeof object[key] !== 'object') {
        throw Error('Property already exists but is not an Object');
      }
      break;
    default:
      throw Error('Unsupported property type');
      break;
  }
}

公平地说,你也可以考虑一个专门为编写的项目,而不是我的项目,因为它只是其中的一小部分,也就是说,https://github.com/hughsk/flat

迭代并添加属性等。。。

function stringToObject(str) {
    var obj = {}, arr = str.split('.');
    
    (function it(o) {
        var key = arr.shift();
        o[key] = {};
        if (arr.length) it(o[key]);
    }(obj));
    
    return obj;
}
var obj = stringToObject("user.member.staffAddress");
document.body.innerHTML = JSON.stringify(obj, null, 4);

字符串转换方法:
var str = 'user.member.staffAddress'
var str_arr = str.split('.')
var obj = JSON.parse(
    '{ "' + str_arr.join('": { "') + '": {}' 
    + Array(str_arr.length+1).join(' }')
)
console.log(obj)
// { "user": { "member": { "staffAddress": {} } } }
  1. 把绳子分开
  2. 使用": { "连接元素
  3. { "": {}包裹新字符串,然后用length个大括号括起
  4. 将最后一个字符串解析为JSON对象

JSFiddle演示