关于 JS 数组,对象 length 使用的坑

场景: laravel中前端请求后端返回一个数组,返回格式如下:

 $data = [ "datalist" =>
        [   16 => ["name" => "钢筋工",
              "count" => 55,
              "num" => 16 ],
            46 => [ "name" => "木工二班",
              "count" => 57,
              "num" => 46 ],
            25 =>[ "name" => "塔吊",
              "count" => 6,
              "num" => 25 ],
            31 => [ "name" => "机电",
              "count" => 5,
              "num" => 31 ],
        ],
        "other" => 0,
        "count" => 188 ,
    ];

JS中拿到数据是个对象,前端获取对象长度使用了(假如返回值用res接收)

var len = res.datalist.length

结果len的值是undefined.

解决:
方案1:

$data = [ "datalist" =>
        [   0 => ["name" => "钢筋工",
              "count" => 55,
              "num" => 16 ],
            1 => [ "name" => "木工二班",
              "count" => 57,
              "num" => 46 ],
            2 =>[ "name" => "塔吊",
              "count" => 6,
              "num" => 25 ],
            3 => [ "name" => "机电",
              "count" => 5,
              "num" => 31 ],
        ],
        "other" => 0,
        "count" => 188 ,
    ];

将datalist变成从0开始的索引数组就好了(用了函数array_values()从新排序了),这样计算出来的长度len = 4;
方案2

var arr = Object.keys(res.datalist);
var len = arr.length; //4

这样的结果len也是4;

总结: 因为方便写后续的代码,我选择了方案1 ,感觉JS的数组(从0按顺序排序)和对象(key值也是0,1,2排序)就是一样一样的。

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 2

伪数组得不到 length,Object.keys 写错了,Object.values

4年前 评论
fffswhk 4年前

@likunyan 这个是我运行过的,keys跟values都能能拿到长度吧,key跟value是一一对应的,数组是有序的,对象是无序的,但是对象key是0,1,2这样有序的,其实就可以像数组那样获得length,获取对象也可以object[0],就跟数组差不多啦

4年前 评论
小李世界 4年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!