标识JavaScript对象或关联数组中的最后一项

标识JavaScript对象或关联数组中的最后一项,javascript,arrays,json,loops,object,Javascript,Arrays,Json,Loops,Object,我正在整理一些JavaScript,这些JavaScript将引入多个JSON文件,这些文件的数据将在图形中使用。最后,我需要确定何时到达$中正在处理的关联数组的绝对末端。each()循环(涉及jQuery)以触发下一个JSON文件。我遇到过针对单层对象的各种解决方案……但是对于多层对象呢?最后一列中的最后一行如何知道它是最后一行 下面是我正在使用的JSON示例: { "Network":{ "Hardware":262464, "Software":53

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

下面是我正在使用的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);     
    });
}
函数构建列(数组,父级){
$.each(数组、函数(键、值){
var newParent=$('');
$('').append($('').html(key)).append(newParent.appendTo(parent);
if(对象的值instanceof)buildColumns(值,newParent);
});
}

正如您所看到的,循环是伪递归的,并且最终可能不是我所使用的。但是你可以找到。

你可以用
length
属性找出一个数组中有多少项

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

{
    "Network": [
         [{"Hardware":262464}],
         [{"Software":53016}],
         //  ...
    ],
    "Wide Area Network":[
        [{ "Hardware":75600}],
        // ...
    ],
    // ...
}
对对象执行此操作的方法是:

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());

JavaScript对象字段的顺序不能保证一致。既不随时间推移,也不在不同的浏览器之间。请看这里:

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

如果要获得最后一项,则需要将对象重新加工为数组

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

我真的不明白问题出在哪里。你是说你的JS代码不起作用吗?在你的$.each使用.length获得对象/数组的长度之前,然后当你在$.each中循环时,您可以获取每个子阵列/层的长度,并重复此过程,直到从$返回索引。每个索引都与长度匹配:)@A.O。您应该移动注释以回答。@ExplosionPills:javascript工作正常。我只需要修改它,使其能够识别多维对象中的绝对最后一项。事实证明,对象本身并不具有与简单数组相同的可发现特性。获取诸如子数组长度之类的信息,或者在项目具有基于文本的键时通过其数字索引选择项目,则更为难以捉摸。那些该死的东西不想成为数组,这些小家伙!JS中没有关联数组。JSON是一个与JS对象具有不同规范的字符串,JSON对象恰好看起来像JSON。对于表格数据,典型的方法是每行使用一个有序标题数组和第二个行数据对象数组。迭代行数据,然后对每一行迭代headers数组,并通过索引到该列(header)的row对象中来发出单元格数据。基本上,我主张重新思考您的设计和数据结构,这样您就不必担心对象顺序(即使现在已经有了保证)。我的理解是(忽略了这一点)。长度对对象不起作用,只对数组起作用。我之前也碰到了那个路障。对不起,我误解了你的问题。我已编辑我的帖子:)请确保检查具有hasOwnProperty的对象上是否存在该属性。否则你可能会得到错误的计数结果,因为它也可以得到原型链中的属性。编辑我的帖子是为了反映你的建议。我真的不会扩展
Object.prototype
。如果我有
var x={count:2}
,我想将JSON转换成数组,但是基于文本的值键不会继续。我需要另一个数组来关联键和值。这将开始变得笨拙。这在PHP中非常简单。叹息