【问题标题】:Javascript Object Keys Not Resolved Until After console.log Is ExpandedJavascript 对象键直到 console.log 展开后才解析
【发布时间】:2015-08-22 17:00:48
【问题描述】:

我遇到了与this stackoverflow question 相同的问题。虽然回答了这个问题,但没有提供解决方案。

我有一个 javascript 对象,其中 console.log(anObject) 显示所有键,但 console.log(JSON.stringify(anObject)) 没有显示所有键,它只显示 2 个中的 1 个。

在 javascript(而不是控制台)级别导致此问题的原因是什么?如何解决此问题,以便此段后面的代码可以访问所有键?

有没有办法强制对象解析?

提前致谢。


它被包裹在一个异步的 getJson 中,但具有讽刺意味的是,被遗漏的数据不是 json 结果数据。我正在使用 cytoscape.js 库。问题出现在本节中 cytoscape.js 文件的第 5183 行附近,它正在解析我的 xar(元素数组),如下所示。数据键存在,但组键不存在,除非它在控制台中使用。

      // specify via opts.nodes and opts.edges
  else if( $$.is.plainObject(opts) && ($$.is.array(opts.nodes) || $$.is.array(opts.edges)) ){
    var elesByGroup = opts;
    var jsons = [];

    var grs = ['nodes', 'edges'];
    for( var i = 0, il = grs.length; i < il; i++ ){
      var group = grs[i];
      var elesArray = elesByGroup[group];

      if( $$.is.array(elesArray) ){

        for( var j = 0, jl = elesArray.length; j < jl; j++ ){
              //console.log(JSON.stringify(elesArray[j]))
          if ( typeof elesArray[j] !== "undefined" ) {
              var json = elesArray[j];
              console.log(elesArray[j].data)
              json.group = group;
              jsons.push( json );
          }
        }
      }
    }

 $(document).ready(function() {

 function notInArray(value, array) {
     return array.indexOf(value) == -1;
 }

 var node_array = new Array();
 var edge_array = new Array();

 var full_data;

 var xar = new Object();

 xar.nodes = [];
 xar.edges = [];

 $.getJSON("http://127.0.0.1/loctest", function(xad) {
     full_data = xad;
     var i = 0;
     $.each(xad, function(key, val) {
         s = val.src;
         d = val.dst;
         if (notInArray(s, node_array)) {
             node_array.push(s);
             xar.nodes[i] = {
                 data: {
                     id: s
                 }
             };
             i++;
         }
         if (notInArray(d, node_array)) {
             node_array.push(d);
             xar.nodes[i] = {
                 data: {
                     id: d
                 }
             };
         }
         xar.edges[i] = {
             data: {
                 id: i.toString(),
                 weight: 3,
                 source: s,
                 target: d
             }
         };
         i++;
     });

     //console.log(xar);
     $('#cy').cytoscape({
         //container: document.getElementById('cy'),

         style: cytoscape.stylesheet()
             .selector('node')
             .css({
                 'content': 'data(id)'
             })
             .selector('edge')
             .css({
                 'target-arrow-shape': 'triangle',
                 'width': 4,
                 'line-color': '#ddd',
                 'target-arrow-color': '#ddd'
             })
             .selector('.highlighted')
             .css({
                 'background-color': '#61bffc',
                 'line-color': '#61bffc',
                 'target-arrow-color': '#61bffc',
                 'transition-property': 'background-color, line-color, target-arrow-color',
                 'transition-duration': '0.5s'
             }),

         elements: xar,

         layout: {
             name: 'breadthfirst',
             directed: true,
             roots: '#a',
             padding: 10
         }
     });


     console.log(cy);
     var bfs = cy.elements().bfs('#a', function() {}, true);

     var p = 0;
     var highlightNextEle = function() {
         bfs.path[p].addClass('highlighted');

         if (p < bfs.path.length) {
             p++;
             setTimeout(highlightNextEle, 1000);
         }
     };

     // kick off first highlight
     highlightNextEle();

 });

});

【问题讨论】:

  • 你能放足够多的代码来重现你的问题吗?
  • 寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现它所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。
  • 添加了代码 sn-p - 我很抱歉没有尽快添加它。我不确定这是否是通用变量对象关键问题或可能特定于此特定代码的问题。因此,我一开始只引用了另一篇 SO 文章。
  • 您好 Eli,您是如何解决问题的?你能强制解析对象吗?
  • 不,我最终重构了 javascript 以不同方式处理 AJAX 调用,以确保在工作流程继续之前完全填充所有变量。

标签: javascript javascript-objects


【解决方案1】:

JSON.stringify 仅列出可枚举的自身属性。

这在15.12.3中有解释:

抽象操作JO(value)序列化一个对象。

K 是一个内部的字符串列表,由所有的名字组成 value 的自身属性,其 [[Enumerable]] 属性为 正确。字符串的顺序应与 Object.keys 标准内置函数使用的顺序相同。

因此,如果您没有看到该属性,则可能意味着

  • 尚未添加该属性。注意console.log可能是异步的,所以调用log后可能会添加该属性,但会显示在控制台中
  • 属性是继承而不是自己的
  • 该属性不可枚举

【讨论】:

  • 根据我引用的另一个问题,我只是使用 JSON.stringify 来证明密钥还不存在。我无法确定为什么密钥不存在,因为异步数据在那里,但是之前不久在代码中添加的这个密钥不存在。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-28
  • 2020-01-08
  • 1970-01-01
相关资源
最近更新 更多