2013-06-18 56 views
5

我有对象结构如下图所示我怎样才能实现这个逻辑

var obj = { 
    a : 1, 
    b : [x,y,z], 
    c : [0,1,3], 
    d : ['%','-','+'] 
} 

我想那个对象转换为以下格式

{ 
    1 : { 
    x : { 
     0 : ['%','-','+'], // Last index remains as an array 
     1 : ['%','-','+'], 
     3 : ['%','-','+'] 
    }, 
    y : { 
     0 : ['%','-','+'], // Last index remains as an array 
     1 : ['%','-','+'], 
     3 : ['%','-','+'] 
    }, 
    z : { 
     0 : ['%','-','+'], // Last index remains as an array 
     1 : ['%','-','+'], 
     3 : ['%','-','+'] 
    } 
    } 
} 

如果在上述情况下['%','-','+']后,多了一个属性,同样的过程继续..

var v = {}/* Object of above */, keys = Object.keys(v), simplifiedColumns = {}; 
for (var i = 0, l = keys.length; i < l ; i++) { 
     if (v[i] instanceof Array) { 

     }else{ 
       simplifiedColumns[keys[i]] = simplifiedColumns[keys[i]] || {}; 
     } 
} 

请建议我完成此logi C。

+5

请注意,Object.keys以任意顺序返回键,因此您应该在开始之前按字典顺序对键进行排序。 – Paulpro

+0

如果我按键排序,那么顺序会改变,对吧?我的要求是以树视图的方式按顺序生成它 – Exception

+3

算法的效率将是k^n(非常低效)。在大量数据上执行此操作将无法正常工作。 –

回答

3

这是一种可以工作的算法,但它只会创建一个对象,即x,yz并引用同一个对象。

此外,以下示例假定键的顺序(由Object.keys()提供)与定义对象的顺序相同。这不会永远是这样,所以更好的解决办法是你的对象变成一个数组:

var obj = [ 
    { 
     "key": "a", 
     "value": 1 
    }, 
    { 
     "key": "b", 
     "value": ["x","y","z"] 
    }, 
    { 
     "key": "c", 
     "value": [0,1,3] 
    }, 
    { 
     "key": "d", 
     "value": ['%','-','+'] 
    } 
]; 

但无论如何,这里是使用原始对象符号的算法:

var obj = { 
    a : 1, 
    b : ["x","y","z"], 
    c : [0,1,3], 
    d : ['%','-','+'] 
}; 

var keys = Object.keys(obj); 

//set tempObj to the last array 
var tempObj = obj[keys[keys.length - 1]]; 

//traverse the rest of the keys backwards 
for (var i = keys.length - 2; i >= 0; i--) { 
    var key = keys[i]; 

    //create new empty object 
    var newObj = {}; 

    //append "tempObj" to that object and using the keys that are in the current array 
    //or if the property isn't an array, use the property itself as key 
    if (Array.isArray(obj[key])) { 
     for (var k = 0; k < obj[key].length; k++) { 
      newObj[obj[key][k]] = tempObj; 
     } 
    } else { 
     newObj[obj[key]] = tempObj; 
    } 
    //override tempObj with the new created object 
    tempObj = newObj; 
} 

FIDDLE

顺便说一句,如果你需要单独的,独立的对象,你可以改变线

newObj[obj[key]] = tempObj; 

喜欢的东西

newObj[obj[key]] = copyObject(tempObj); 

其中copyObject是创建一个对象的深层副本的功能。但我想在这种情况下,性能会急剧下降,因为您一遍又一遍地复制相同的对象。

+0

keys.sort()导致不需要的结果.. :(如果我删除排序它对我来说工作正常... – Exception

+0

@Exception当您删除排序依赖于未定义的行为,这只是在一些实现中正常工作的Javascript,它可能在大多数版本的Chrome中都不起作用,但它不是Chrome中的一个bug,它的发生是因为你将对象看作是有序的,所以你应该能够重写你的代码,无序对象:'{a:1,b:2}'你有一对有序数组:'[{a:1},{b:2}]',那么你可以在所有Javascript引擎。 – Paulpro

+0

@Paulpro我不明白。为什么'sort()'应用于数组会导致任何问题? – basilikum