在调用JSON值时如何使用变量?

时间:2015-03-05 18:05:17

标签: javascript jquery json

我有一个将XML转换为“JSON”的脚本。可以使用styles.Default.FontName(例如)访问可用数据。但是,我不需要在该行中手动插入“Default”,而是需要能够使用变量。我需要能够使用'styles.XXXX.XXXX'的许多不同组合。

这是我的脚本     function 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);
    }

  });

}

那么,我怎样才能在这里使用变量而不是指定'Default'或's59'?非常感谢任何帮助!

澄清我的要求...... 使用**styles.Default.FontName**工作正常。我只需要能够用变量动态交换'默认'。为什么?因为我将使用这个迭代通过“Cells”的内部循环,每个循环都有不同的“StyleID”。上面通过data.each()显示了这个循环。因此,每次迭代,都可能会引用不同的“StyleID”。

但是当我使用styles.SomeVariable.SomeStyle时,它不是插入我为' SomeVariable '设置的值,而是引用“SomeVariable”的JSON对象......

更新

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"
  }
}

2 个答案:

答案 0 :(得分:1)

修改,更新

尝试用var styleId = cell.data('styleid');代替var styleId = cell.data('styleID');;因为data-*属性名称转换为小写。

请参阅jquery get HTML 5 Data Attributes with hyphens and Case Sensitivity

注意,undefineds58处返回,其中没有属性名称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()


&#13;
&#13;
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)
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js">
</script>
&#13;
&#13;
&#13;

答案 1 :(得分:0)

使用与[]符号

分配对象属性相同的方式执行此操作
var someVal = object[variable];

您还可以组合记谱法类型

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