【问题标题】:JS array string patch name to array(object)JS数组字符串补丁名称到数组(对象)
【发布时间】:2014-10-20 01:23:38
【问题描述】:

我遇到了 js 数组的问题。 我的补丁名称(字符串)看起来像(“user.joey.friends.0.franc”),我需要“压缩”看起来像这样:

console.log( parseArray( "user.joey.friends.0.franc" ) );
//Object {
            user: {
                joey: {
                    friends: {
                        0: {
                            franc: 1
                        }
                    }
                }
            }
        }

有什么想法,怎么做?

【问题讨论】:

  • 首先:您正在处理一个 JavaScript object——其中可能包含一个数组(取决于您如何处理“0”)。第二——你试过什么?你最好的解决方案是递归的——拿一个对象,看看你的密钥user是否在那里。如果没有,请添加密钥。然后,向下传递该对象和您的下一个键 joey 并一点一点地遍历您的字符串。您可以在字符串上使用split 方法将其分开。
  • 我不知道你想在这里做什么,但你不能引用像variable.variable.0.variable 这样的点格式的数字,因为它会将其视为小数。您必须使用括号 variable.variable[0].variable
  • 真的不清楚你在问什么。你是说你有一个对象的结构是你为a 引用的,并且你正在尝试查找由你的字符串"user.joey.friends.0.franc" 定义的属性?如果是这样,@Jeremy 就在正确的轨道上,但它甚至不必是递归的,它只是一个循环。
  • 感谢您的回答,但我还有其他问题,我有数组的字符串名称(“user.joey.friends.0.franc”),我需要将数组名称转换为对象(用户:{ joey :{ .. } } ) @Jeremy J Starcher,谢谢你的想法,但有更简单的方法吗?

标签: javascript arrays string parsing converter


【解决方案1】:

这是一种非递归方式,可帮助您完成大部分工作。

function compress(str) {
    var split = str.split('.'), obj = {}, current = obj, i;

    for (i = 0; i < split.length; i++){
        current[split[i]] =  {} ;
        current = current[split[i]];
    }

    return obj;
}

【讨论】:

  • 谢谢,就是这样:)
  • 如果这对您有用,我将不胜感激您勾选此答案的复选标记。干杯。
【解决方案2】:

如果您说您有一个具有您引用的结构的对象,并且您正在尝试查找由字符串 "user.joey.friends.0.franc" 定义的属性,那么这是一个相当简单的循环:Live Example

function findProperty(obj, path) {
    var steps = path.split(/\./);
    var step;
    var n;
    for (n = 0; n < steps.length; ++n) {
        step = steps[n];
        if (!(step in obj)) {
            return undefined;
        }
        obj = obj[step];
    }
    return obj;
}

var a =  {
  user: {
    joey: {
      friends: {
        0: {
          franc: 1
        }
      }
    }
  }
};

console.log(findProperty(a, "user.joey.friends.0.franc")); // "1"

【讨论】:

    【解决方案3】:

    如果您尝试从字符串创建对象,我目前使用此解决方案,直到找到更好的解决方案(我相信它基于 Yahoo 的命名空间方法):

    function createObject() {
      var a = arguments, i, j, d, _this;
      var out = {};
      for (i = 0; i < a.length; i = i + 1) {
        d = a[i].split('.');
        out2 = out;
        for (j = 0; j < d.length; j = j + 1) {
          out2[d[j]] = out2[d[j]] || {};
          out2 = out2[d[j]];
        }
      }
      return out;
    }
    
    createObject('user.joey.friends.0.franc');
    

    DEMO

    【讨论】:

    • 谢谢,就是这样:)
    猜你喜欢
    • 1970-01-01
    • 2015-08-15
    • 1970-01-01
    • 1970-01-01
    • 2012-05-08
    • 2019-03-14
    • 2022-12-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多