【问题标题】:Identifying the last item in a JavaScript object or associative array [duplicate]识别 JavaScript 对象或关联数组中的最后一项
【发布时间】:2013-08-23 17:20:31
【问题描述】:

我正在整理一些 JavaScript,这些 JavaScript 将提取多个 JSON 文件,这些文件的数据将在图表中使用。最终,我需要确定何时到达$.each() 循环中正在处理的关联数组的绝对末端(涉及jQuery),以便触发下一个JSON 文件。我遇到了针对单层对象的各种解决方案……但是多层对象呢?最后一列的最后一行怎么知道是 LAST?

这是我正在使用的 JSON 示例:

{
    "Network":{
        "Hardware":262464,
        "Software":53016,
        "Internal Personnel":440202,
        "External Personnel":188658,
        "Outside Services":1344100,
        "Facilities and Overhead":16172,
        "Other":92588,
        "Total":2397200
    },
    "Wide Area Network":{
        "Hardware":75600,
        "Software":18900,
        "Internal Personnel":132300,
        "External Personnel":56700,
        "Outside Services":315000,
        "Facilities and Overhead":6300,
        "Other":25200,
        "Total":630000
    }
}

这是我在 JSON 上运行的循环的粗略概念

function buildColumns(array, parent) {
    $.each(array, function(key, value) {
        var newParent = $('<column>'); 
        $('<columnBox>').append($('<h2>').html(key)).append(newParent).appendTo(parent);
        if(value instanceof Object) buildColumns(value, newParent);     
    });
}

如您所见,循环是伪递归的,最终可能不是我使用的。但是你去吧。

【问题讨论】:

  • 我真的不明白问题出在哪里。你是说你的JS代码不行?
  • 在 $.each 使用 .length 获取对象/数组的长度之前,然后当您在 $.each 内部循环时,您可以获得每个子数组/层的长度并重复处理直到从 $.each 返回的索引与长度匹配:)
  • @A.O.你应该移动你的评论来回答。
  • @ExplosionPills:javascript 工作正常。我只需要修改它,使其能够识别多维对象中的绝对最后一项。事实证明,对象本身并不具有与简单数组相同的可发现特征。获取诸如子数组长度之类的信息,或者当它具有基于文本的键时通过其数字索引选择一个项目,则更加难以捉摸。那些该死的对象不想成为数组,小虫子!
  • JS 中没有关联数组这种东西。 JSON 是一个与 JS 对象具有不同规范的字符串,它恰好看起来像 JSON。对于表格数据,典型的方法是使用每行有序标题的数组和第二个行数据对象数组。迭代行数据,然后对于每一行,迭代 headers 数组并通过索引到该列(标题)的行对象来发出单元格数据。基本上,我提倡重新考虑您的设计和数据结构,这样您就不必担心对象排序(即使现在已经得到保证)。

标签: javascript arrays json loops object


【解决方案1】:

您可以使用length 属性了解数组中有多少项。

因此,在您的示例中,array.length 将返回项目数。假设传递的变量是一个数组。

您可以对对象执行此操作的方式是:

Object.keys(jsonObject).length

另外,因为我不确定它是数组还是对象,所以您可以使用下面的代码将 count 方法添加到对象以查找它有多少个子对象有:

Object.prototype.count = function() {
  oCount = 0; 
  for(var curObj in this) 
    if(curObj.hasOwnProperty(prop)) oCount++; 
  return oCount;
};

这样使用:

console.log(jsonObject.count());

【讨论】:

  • 我的理解(无知暴露自己)是 .length 不适用于对象,仅适用于数组。我之前也遇到了那个障碍。
  • 对不起,我误解了你的问题。我已经编辑了我的帖子:)
  • 确保使用 hasOwnProperty 检查该属性是否存在于对象上。否则可能会得到错误的计数结果,因为它也可以获取原型链中的属性。
  • 感谢 Wim,我写得很快。编辑了我的帖子以反映您的建议。
  • 我真的不会扩展Object.prototype。如果我有var x = {count: 2}怎么办?
【解决方案2】:

JavaScript 对象的字段顺序不保证是一致的。无论是随着时间的推移还是在不同的浏览器之间。见这里:Does JavaScript Guarantee Object Property Order?

所以最后一项并不总是相同的。

如果你想拥有最后一项,你需要将你的对象重新加工成一个数组。

{
    "Network": [
         [{"Hardware":262464}],
         [{"Software":53016}],
         //  ...
    ],
    "Wide Area Network":[
        [{ "Hardware":75600}],
        // ...
    ],
    // ...
}

【讨论】:

  • 我曾想过将 JSON 转换为数组,但该值的基于文本的键不会继承。我需要另一个数组来将键与值相关联。那将开始变得笨拙。这在 PHP 中会很容易。 叹息
猜你喜欢
  • 2011-05-27
  • 1970-01-01
  • 2011-12-30
  • 2015-04-22
  • 1970-01-01
  • 1970-01-01
  • 2011-12-09
  • 2011-05-18
  • 2014-08-06
相关资源
最近更新 更多