2015-03-05 3 views
0

У меня есть сценарий, который преобразует XML в "JSON". Доступные данные можно получить, используя styles.Default.FontName (например). Однако вместо того, чтобы вручную вставлять «Default» в эту строку, мне нужно иметь возможность использовать переменную. Мне нужно иметь возможность использовать множество разных комбинаций «styles.XXXX.XXXX».Как использовать переменные при вызове значений JSON?

Вот мой сценарий функция convertData (XML) {

var styles = {} 

    $(xml).find('Style').each(function() { 

    var id = $(this).attr('ss:ID'); 
    var name = $(this).attr('ss:Name'); 
    var type = $(this).children(); 

    var style = {}; 

    styles[id] = style; 

    style['Name'] = name; 

    type.each(function() { 

     $.each(this.attributes, function() { 

     if (this.specified) { 
      style[stripPrefix(this.name)] = this.value; 
     } 

     }); 

    });; 

    // You can now use 'styles.s57.FontName' and the like to return values :) 

    }); 

    $(xml).find('Worksheet').each(function() { 
    var name = $(this).attr('ss:Name'); 
    var data = $(this).find('Data'); 

    data.each(function() { 
     var cell = $(this).parent('Cell'); 
     var value = $(this).text(); 
     var styleId = cell.attr('ss:StyleID'); 
     $(window).load(function() { 
     // Here is my issue (see below for working calls...) 
     // This guy doesn't work (because of the 'styleId' variable not being an actual style id like 's57') 
     $('.testing').append('<span class="color:#f60;">' + styles.styleId.Color + '</span>'); 
     }); 
    }); 

    }); 

    $(document).ready(function() { 

    $('body').append('<div class="testing"/>'); 

    // Works fine 
    $('.testing').html(styles.Default.FontName); 
    $('.testing').append(styles.s59.Bold); 

    $('body').append('<div class="json-output"/>'); 
    $('.json-output').append(JSON.stringify(styles)); 

    for (var i in styles) { 
     console.log(i); 
    } 

    }); 

} 

Итак, как я могу использовать переменную здесь вместо указания 'по умолчанию' или 'S59'? Любая помощь очень ценится!

Чтобы пояснить, что я прошу ... Использование **styles.Default.FontName** работает нормально. Мне просто нужно иметь возможность динамически менять «По умолчанию» с переменной. Зачем? Потому что я буду использовать эти внутренние циклы, которые повторяются через «Ячейки», каждая из которых имеет разные «StyleID». Этот цикл показан выше через data.each(). Таким образом, каждая итерация может быть связана с другим «StyleID».

Но когда я использую styles.SomeVariable.SomeStyle, вместо того, чтобы вставить какое значение я поставил 'SomeVariable', он ссылается на объект JSON для "SomeVariable" ...

UPDATE:

jsFiddle

Для справочно сгенерированного JSON

{ 
    "Default":{ 
    "Name":"Normal", 
    "Vertical":"Bottom", 
    "FontName":"Calibri", 
    "Family":"Swiss", 
    "Size":"11", 
    "Color":"#000000" 
    }, 
    "s57":{ 
    "Name":"Hyperlink", 
    "FontName":"Calibri", 
    "Family":"Swiss", 
    "Size":"11", 
    "Color":"#0066CC", 
    "Underline":"Single" 
    }, 
    "s58":{ 
    "Horizontal":"Left", 
    "Vertical":"Center", 
    "Indent":"1" 
    }, 
    "s59":{ 
    "Vertical":"Center", 
    "WrapText":"1", 
    "FontName":"Calibri", 
    "Family":"Swiss", 
    "Size":"11", 
    "Color":"#000000", 
    "Bold":"1" 
    } 
} 

ответ

0

ли это так же, как вы назначаете свойства объекта, используя [] обозначения

var someVal = object[variable]; 

Вы также можете комбинировать типы обозначения

var someVal = object[variable][anotherVariable].someProperty; 
+0

Можете ли вы привести пример того, что он хотел бы и как я могу использовать его в своем сценарии (используя мои значения выше)? – derekmx271

+0

не уверен, где вы хотите, чтобы переменные приходили от – charlietfl

+0

В настоящее время я могу использовать «styles.SomeID.SomeStyle». Я хотел бы иметь возможность продолжать использовать этот синтаксис. Просто вместо «SomeID», я бы использовал переменную. Но JS пытается найти значение в JSON со значением моей переменной, вместо того, чтобы вставлять любое значение этой переменной ... – derekmx271

1

Edit, Изменено

Попробуйте заменить var styleId = cell.data('styleid'); для var styleId = cell.data('styleID'); ; поскольку имя атрибута data-* преобразуется в нижний регистр.

См jquery get HTML 5 Data Attributes with hyphens and Case Sensitivity

Примечание, undefined вернулся в s58, где нет имени свойства Color.

jsfiddle http://jsfiddle.net/yao01h4b/10/


Попробуйте

var name = "styleId" 
, option = {}; 
option[name] = styles.s57; 

var styleId = $.extend(styles, option); 
// do stuff with `styles.styleId.s57` 
document.write(styles.styleId.FontName); 

См jQuery.extend()


var styles = { 
 
    "Default":{ 
 
    "Name":"Normal", 
 
    "Vertical":"Bottom", 
 
    "FontName":"Calibri", 
 
    "Family":"Swiss", 
 
    "Size":"11", 
 
    "Color":"#000000" 
 
    }, 
 
    "s57":{ 
 
    "Name":"Hyperlink", 
 
    "FontName":"Calibri", 
 
    "Family":"Swiss", 
 
    "Size":"11", 
 
    "Color":"#0066CC", 
 
    "Underline":"Single" 
 
    }, 
 
    "s58":{ 
 
    "Horizontal":"Left", 
 
    "Vertical":"Center", 
 
    "Indent":"1" 
 
    }, 
 
    "s59":{ 
 
    "Vertical":"Center", 
 
    "WrapText":"1", 
 
    "FontName":"Calibri", 
 
    "Family":"Swiss", 
 
    "Size":"11", 
 
    "Color":"#000000", 
 
    "Bold":"1" 
 
    } 
 
}; 
 

 
var name = "styleId" 
 
, option = {}; 
 
option[name] = styles.s57; 
 

 
var styleId = $.extend(styles, option); 
 

 
document.write(styles.styleId.FontName)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"> 
 
</script>

+0

Это выглядит многообещающим. Я пытаюсь реализовать сейчас. Спасибо, и я скоро отправлю отчет :) – derekmx271

+0

Итак, я разместил ваше решение внутри цикла data.each(). и заменил «s57» на переменную, которая идентифицирует «StyleID» этой ячейки, и я получаю сообщение об ошибке в консоли. Я заменяю переменную (которая, btw, возвращает «s57, Default и т. Д.») Со строкой «s57» или «Default», и она отлично работает. Проблема в том, что мой скрипт уже ведет себя так. Мне нужно, чтобы «s57» в вашем скрипте являлся переменной :( – derekmx271

+0

Может ли текст «ошибка»? Не определен правильно интерпретировать, можно создать stacksnippets, http://jsfiddle.net, чтобы продемонстрировать? – guest271314

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