2012-05-27 1 views
1

У меня есть объект с глубиной не более 3:Перестановка объектов JavaScript

OBJ.T.V.E={...} 

Т и V являются целыми числами (например, в OBJ [0] [1] [ 'Строка'] = {...}) так типичная структура может быть:

OBJ[0][0]['S1']={..} 
OBJ[0][0]['S2']={..} 
OBJ[0][1]['S1']={..} 
OBJ[0][2]['S1']={..} 

Я хочу изменить и получить как-то так:

OBJNEW['S1'][0][0]={...} 

, который будет иметь такое же значение, как и в OBJ[0][0]['S1']

Я борюсь часами без везения. Есть идеи? Код JQuery также приветствуется.

EDIT: Прямо сейчас я попытался создать массив объектов, как, что:

OBJ2=[]; 
$.each(OBJ, function(name, value) { 
    $(value).each(OBJ, function(name1, value1) { 
    OBJ2[name1]=[]; 
    $(value1).each(OBJ, function(name2, value2) { 
     OBJ2[name1][name2]={}; 
     OBJ2[name1][name2]['S1']={}; 
    }) 
    }) 

Но этот шаг не удается, так как каждый ... [ «S1»] присваивание перезаписывает предыдущий объект (например, S2).

Прошу игнорировать любые опечатки, я только что воссоздал логику.

+0

Можете ли вы показать нам некоторые из кода, который вы уже пробовали, который не сработал? –

+0

Я могу придумать волшебство, зачем это делать. просто переместите объект и замените значения. – gdoron

+0

Похоже, вы ищете самый сложный способ сделать что-то. – frenchie

ответ

3

Это должно сделать вас довольно далеко, если я не пойму.

function flipObject(o) { 
    var i1, i2, i3, result = {}; 

    for (i1 in o) { 
    if (o.hasOwnProperty(i1)) { 
     for (i2 in o[i1]) { 
     if (o[i1].hasOwnProperty(i2)) { 
      for (i3 in o[i1][i2]) { 
      if (o[i1][i2].hasOwnProperty(i3)) { 
       if (!(i3 in result)) result[i3] = {}; 
       if (!(i1 in result[i3])) result[i3][i1] = {}; 
       result[i3][i1][i2] = o[i1][i2][i3]; 
      } 
      } 
     } 
     } 
    } 
    } 
    return result; 
} 

Оказывается

{ 
    "0": { 
     "0": { 
      "s1": "s1.0.0", 
      "s2": "s2.0.0" 
     }, 
     "1": { 
      "s1": "s1.0.1", 
      "s2": "s2.0.1" 
     } 
    }, 
    "1": { 
     "0": { 
      "s1": "s1.1.0", 
      "s2": "s2.1.0" 
     }, 
     "1": { 
      "s1": "s1.1.1", 
      "s2": "s2.1.1" 
     } 
    } 
} 

в

{ 
    "s1": { 
     "0": { 
      "0": "s1.0.0", 
      "1": "s1.0.1" 
     }, 
     "1": { 
      "0": "s1.1.0", 
      "1": "s1.1.1" 
     } 
    }, 
    "s2": { 
     "0": { 
      "0": "s2.0.0", 
      "1": "s2.0.1" 
     }, 
     "1": { 
      "0": "s2.1.0", 
      "1": "s2.1.1" 
     } 
    } 
} 
+0

Что здесь делает 'hasOwnProperty'? Кажется, я получил что-то работающее, не используя его (см. Мой ответ). –

+1

@Merlyn Если вы не знаете, что прототип объекта не был изменен, неразумно перечислять объект с 'in .. in', не проверяя, что указанное перечисление действительно существует в данном экземпляре. Ваше решение не сработает, если загрузится, например, [underscore.js] (http://underscorejs.org/). – Tomalak

+0

Хороший пример и хорошая информация о том, почему вы используете 'hasOwnProperty'. +1 –

1

Некоторые проблемы в исходном коде, что вы не можете использовать простой массив [] как ассоциативный массив {}. Строковые ключи могут использоваться только в ассоциативном массиве. Следующая проблема заключается в том, что вы можете и должны перебирать все ваши строковые ключи, а не пытаться их жестко закодировать.

Простейшая вещь, которую вы можете сделать, это написать for/in петли для каждого уровня иерархии исходного объекта, а затем перевернуть присваивание при записи их на новый объект. Вам также нужно будет проверить, существуют ли родительские ключи, а если нет, создайте их.

var NEWOBJ = {}; 

for (var outerKey in OBJ) { 
    for (var innerKey in OBJ[outerKey]) { 
    for (var stringKey in OBJ[outerKey][innerKey]) { 
     NEWOBJ[stringKey] = NEWOBJ[stringKey] || {}; 
     NEWOBJ[stringKey][outerKey] = NEWOBJ[stringKey][outerKey] || {}; 
     NEWOBJ[stringKey][outerKey][innerKey] = OBJ[outerKey][innerKey][stringKey]; 
    } 
    } 
} 

console.log(NEWOBJ);​ 

Насколько я знаю, jQuery ничего не поможет, чтобы помочь вам здесь. Это действительно не намного проще, чем собственный Javascript, который выполняет одно и то же.

Обратите внимание, что это не делает глубокую копию объектов, которые вы перемещаете. Я считаю, что если вы измените объекты в NEWOBJ, они также будут изменены в OBJ. Я думаю, что было бы сложно решить эту проблему в целом, и вам, вероятно, придется прибегнуть к пользовательскому объекту копирования для каждого типа объекта.

Также обратите внимание, что я не являюсь Javascript GURU. Я знаю, что иногда возникают проблемы при повторении свойств объекта, который может решить hasOwnProperty, который может появиться в примере, подобном этому. Однако я не знаю, что это за проблемы.Например, я пробовал этот код с помощью простого объекта JSON, и он работал :)

http://jsfiddle.net/e9uST/ - используйте консоль Javascript в своем браузере, чтобы увидеть результат.

+0

действительно благодарю вас за ваши усилия, но решение Томалака лучше всего подходит для моего дела. – sivann

+0

@sivann: Добро пожаловать. Ответы охватывают разные области (следовательно, почему я покидаю мой), но я согласен с тем, что код Томалака является лучшим решением проблемы. –

+0

Я думаю, что с правой стороны вы подразумеваете = OBJ, а не = NEWOBJ (после внутреннего для) – sivann

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