Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/419.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
来自字符串的Javascript嵌套对象_Javascript_Jquery_String_Object_Split - Fatal编程技术网

来自字符串的Javascript嵌套对象

来自字符串的Javascript嵌套对象,javascript,jquery,string,object,split,Javascript,Jquery,String,Object,Split,我有一个空对象和一个字符串: var obj = {}; var str = "a.b.c"; 有什么办法可以把它变成 obj = { a: { b: { c: { } } } } 我不能完全理解这一点,我甚至不确定这是否可能。这是来自yui2 yahoo.js文件 YAHOO.namespace = function() { var a=arguments, o=null, i, j, d; for (i=0; i<a.length; i=i+1) { d=(""

我有一个空对象和一个字符串:

var obj = {};
var str = "a.b.c";
有什么办法可以把它变成

obj = { a: { b: { c: { } } } }

我不能完全理解这一点,我甚至不确定这是否可能。

这是来自yui2 yahoo.js文件

YAHOO.namespace = function() {
  var a=arguments, o=null, i, j, d;
  for (i=0; i<a.length; i=i+1) {
      d=(""+a[i]).split(".");
      o=YAHOO;

      // YAHOO is implied, so it is ignored if it is included
      for (j=(d[0] == "YAHOO") ? 1 : 0; j<d.length; j=j+1) {
          o[d[j]]=o[d[j]] || {};
          o=o[d[j]];
      }
  }

  return o;
};
YAHOO.namespace=function(){
变量a=参数,o=null,i,j,d;
对于(i=0;i

给你:

var string = "a.b.c",
   array = string.split('.');
JSON.parse("{\"" + array.join('": {\"') + "\": {" +array.map(function () {return '}'}).join('') + "}")
以下是我对它的看法:

function ensureKeys(str, obj) {
    for(var parts = str.split('.'), i=0, l=parts.length, cache=obj; i<l; i++) {
        if(!cache[parts[i]]) { 
            cache[parts[i]] = {};
        }
        cache = cache[parts[i]];
    }

    return obj;
}

var obj = {};
ensureKeys('a.b.c', obj);
// obj = { a: { b: { c: {} } } }
功能确保键(str、obj){

对于(var parts=str.split('.'),i=0,l=parts.length,cache=obj;i此递归函数返回所需对象的字符串表示形式

//Usage: getObjectAsString('a.b.c'.split(/\./))
function getObjectAsString (array){
   return !array.length ? '{}' 
             : '{"' + array[0] + '":' + getObjectAsString (array.slice(1)) + '}';
}
现在,您可以使用

JSON.parse(getObjectAsString('a.b.c'.split(/\./)))

编辑:删除了“输入为字符串”版本,因为它仅适用于命名空间中的单字母子部分,如问题(a.b.c)中给出的子部分通常情况并非如此。

你的场景和最终目标是什么?我怀疑有更好的方法来实现你的最终目标,而不是尝试这样做。这是一个面试问题吗?YUI中有类似的东西来创建对象。我会看看我是否能找到它。几乎所有东西都可能重复有些东西的效率要低得多……这是一种非常有趣的方法。不过我很好奇,是什么让我的解决方案更容易阅读与此或上面的upvote相比,没有那么有用。对于代码的清晰性和简单性,不是有什么要说的吗?@Dr.Dredel,我听到了,伙计,但是在javascript中有一种普遍的厌恶
eval()
。真的,因为你控制着
eval()的代码
,在您的解决方案中使用eval的主要缺点是对性能的影响。仅供参考:@Johathan M.谢谢!我点击了那个链接,希望被告知我在使用eval方面是个十足的傻瓜,但这是一个非常清醒和理性的检查,实际上清楚地表明,使用eval并不是更多的任务,应该被大量使用h与我使用的完全相同(如果可能的话,减少代码混乱).正如我所说,我的解决方案基本上只是一个破解,这是对一个问题的第一个答案,但我仍然无法理解这个问题的目的。总的来说,我发现SOER往往很小气,渴望否决那些容易被忽略的事情。这是一个非常出色、优雅简单的解决方案。我所拥有的非常接近这一点,但我没有lly set tmp=obj是问题的始作俑者。谢谢你的帮助!@user977433:我怀疑在循环中你可以将它浓缩为
tmp=tmp[arr[I]]={}
去掉花括号。@vol7ron你的意思和我30分钟前的答案完全一样?@vol7ron不管怎样,你的答案和我的几乎一样,只是更详细。你甚至使用了相同的变量名。检查一下时间,它正好在30分钟后发布。这有点违背了我的全部目的,所以如果你问我…@David:T如果你问我的话,你为了一个答案扣了一分,出于怨恨,这一事实有点违背了这样做的全部目的。。。
var obj = {};
var str = "a.b.c";
var arr = str.split('.');
var tmp = obj;

for (var i=0,n=arr.length; i<n; i++){
   tmp[arr[i]]={};
   tmp = tmp[arr[i]];
}