2013-06-18 3 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]] || {}; 
     } 
} 

Просьба предложить мне заполнить эту книгу с.

+5

Обратите внимание, что 'Object.keys' возвращает ключи в произвольном порядке, поэтому вы должны, вероятно, отсортировать ключи лексикографически перед запуском. – Paulpro

+0

Если я сортирую ключи, тогда заказ будет изменен, не так ли? мое требование состоит в том, чтобы сгенерировать его в древовидном виде в порядке – Exception

+3

. Эффективность алгоритма для этого будет k^n (очень неэффективная). Выполнение этого на большом наборе данных просто не будет работать. –

ответ

3

Вот алгоритм, который работает, но он создаст только один объект для i.e. x, y и z и обратитесь к этому же объекту.

Кроме того, в следующем примере предполагается, что порядок ключей (предоставленный 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

Btw, если вам нужны отдельные, независимые объекты, вы можете изменить линию

newObj[obj[key]] = tempObj; 

к чему-то вроде

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

где copyObject это функция, которая создает глубокую копию объекта. Но я думаю, что в этом случае производительность резко снизится, так как вы копируете одни и те же объекты снова и снова.

+0

keys.sort(), приводящий к нежелательным результатам .. :(Если я удалю сортировку, он отлично работает для меня ... – Exception

+0

@Exception Когда вы удаляете сортировку, полагаются на неопределенное поведение, которое просто работает правильно в некоторых реализациях Javascript, вероятно, не будет работать в большинстве версий Chrome, но это не ошибка в Chrome. Это происходит потому, что вы обрабатываете объект так, как будто он имеет порядок. Вы должны немного переписать свой код, чтобы вместо этого неупорядоченного объекта: '{a: 1, b: 2}' у вас есть упорядоченный массив пар: '[{a: 1}, {b: 2}]'. Тогда вы можете получить четко определенное поведение во всех Javascript engine. – Paulpro

+0

@Paulpro Я не понимаю.Почему «sort()», применяемый к массиву, вызывает какие-либо проблемы? – basilikum

Смежные вопросы